parsley/lib/unit_conversion/parsed_number.rb
2018-04-01 22:32:13 -05:00

39 lines
868 B
Ruby

module UnitConversion
class ParsedNumber
attr_reader :value
def initialize(str)
@original_value = str
@value = str.is_a?(Numeric) ? str : parse_value(str)
end
def to_s
@value.to_s
end
def rational?
value.is_a?(Integer) || value.is_a?(Rational)
end
def parse_value(str)
str = str.to_s.strip
if str =~ /^#{INTEGER_REGEX}$/
str.to_i
elsif str =~ /^#{RATIONAL_REGEX}$/
parts = str.split(' ')
if parts.length == 2
whole = parts.first.to_r
fractional = parts.last.to_r
(whole.abs + fractional) * (whole < 0 ? -1.to_r : 1.to_r)
else
str.to_r
end
elsif str =~ /^#{DECIMAL_REGEX}$/
str.to_d
else
raise UnparseableUnitError, "str [#{str}] is not a valid number"
end
end
end
end