Module: Numerals::Conversions
- Defined in:
- lib/numerals/conversions.rb
Class Method Summary collapse
- .[](type, options = nil) ⇒ Object
- .exact?(number, options = {}) ⇒ Boolean
- .number_of_digits(number, options = {}) ⇒ Object
- .order_of_magnitude(number, options = {}) ⇒ Object
-
.read(numeral, options = {}) ⇒ Object
Convert Numeral to Number.
-
.write(number, options = {}) ⇒ Object
Convert Number to Numeral.
Class Method Details
.[](type, options = nil) ⇒ Object
4 5 6 7 8 |
# File 'lib/numerals/conversions.rb', line 4 def [](type, = nil) if type.respond_to?(:numerals_conversion) type.numerals_conversion( || {}) end end |
.exact?(number, options = {}) ⇒ Boolean
85 86 87 |
# File 'lib/numerals/conversions.rb', line 85 def exact?(number, = {}) self[number.class, [:type_options]].exact?(number, ) end |
.number_of_digits(number, options = {}) ⇒ Object
14 15 16 |
# File 'lib/numerals/conversions.rb', line 14 def number_of_digits(number, ={}) self[number.class, [:type_options]].number_of_digits(number, ) end |
.order_of_magnitude(number, options = {}) ⇒ Object
10 11 12 |
# File 'lib/numerals/conversions.rb', line 10 def order_of_magnitude(number, ={}) self[number.class, [:type_options]].order_of_magnitude(number, ) end |
.read(numeral, options = {}) ⇒ Object
Convert Numeral to Number
read numeral, ={}
If the input numeral is approximate and the destination type allows for arbitrary precision, then the destination context precision will be ignored and the precision of the input will be preserved. The :simplify option affects this case by generating only the mininimun number of digits needed.
The :exact option will prevent this behaviour and always treat input as exact.
Valid output options:
-
:type class of the output number
-
:context context (in the case of Flt::Num, Float) for the output
-
:simplify (for approximate input numeral/arbitrary precision type only)
-
:exact treat input numeral as if exact
38 39 40 41 42 43 44 |
# File 'lib/numerals/conversions.rb', line 38 def read(numeral, ={}) selector = [:context] || [:type] exact_input = [:exact] approximate_simplified = [:simplify] conversions = self[selector, [:type_options]] conversions.read(numeral, exact_input, approximate_simplified) end |
.write(number, options = {}) ⇒ Object
Convert Number to Numeral
write number, ={}
Valid options:
-
:rounding (a Rounding) (which defines output base as well)
-
:exact (exact input indicator)
Approximate mode:
If the input is treated as an approximation (which is the case for types such as Flt::Num, Float,… unless the :exact option is true) then no ‘spurious’ digits will be shown (digits that can take any value and the numeral still would convert to the original number if rounded to the same precision)
In approximate mode, if rounding is simplifying? (:short), the shortest representation which rounds back to the origina number with the same precision is used. If rounding is :free and the output base is the same as the number internal radix, the exact precision (trailing zeros) of the number is represented.
Exact mode:
Is used for ‘exact’ types (such as Integer, Rational) or when the :exact option is defined to be true.
The number is treated as an exact value, and converted according to Rounding. (in this case the :free and :short precision roundings are equivalent)
78 79 80 81 82 83 |
# File 'lib/numerals/conversions.rb', line 78 def write(number, = {}) output_rounding = Rounding[[:rounding] || Rounding[]] conversion = self[number.class, [:type_options]] exact_input = conversion.exact?(number, ) conversion.write(number, exact_input, output_rounding) end |