class Foraneus::Converters::Float

Constants

DEFAULT_SEPARATOR
DELIMITED_REGEX

Attributes

opts[R]

Public Class Methods

new(opts = {}) click to toggle source

@param [Hash] opts @option opts [String] delimiter Thousands delimiter. @option opts [String] separator Decimal separator. @option opts [Integer] precision Minimum precision.

# File lib/foraneus/converters/float.rb, line 16
def initialize(opts = {})
  @opts = opts

  @delimiter = opts[:delimiter]
  @precision = opts[:precision]
  @separator = opts[:separator] || DEFAULT_SEPARATOR
end

Public Instance Methods

parse(s) click to toggle source

@raise [ArgumentError] with message ‘invalid value for Float(): …’

@return [Float]

# File lib/foraneus/converters/float.rb, line 27
def parse(s)
  integer_part, fractional_part = split(s)

  Kernel.Float("#{integer_part}.#{fractional_part}")
end
raw(v) click to toggle source
# File lib/foraneus/converters/float.rb, line 33
def raw(v)
  left, right = v.to_s.split('.')

  join(left, right)
end

Protected Instance Methods

join(left, right) click to toggle source

Joins both integer and fractional parts.

It adds trailing zeros according to the current precision.

@param [Integer] left Integer part @param [Integer] right Fractional part

@return [String]

# File lib/foraneus/converters/float.rb, line 48
def join(left, right)
  if @precision && right.length < @precision
    right = add_trailing_zeros(right, @precision - right.length)
  end

  if @delimiter
    left.gsub!(DELIMITED_REGEX) { "#{$1}#{@delimiter}" }
  end

  "#{left}#{@separator}#{right}"
end
split(s) click to toggle source

Splits a float representation into its integer and fractional parts.

@param [String] s

@return [Array [integer_part, fractional_part] ]

# File lib/foraneus/converters/float.rb, line 65
def split(s)
  parts = s.split(@separator)

  integer_part = parts[0] || '0'

  if @delimiter
    integer_part.gsub!(@delimiter, '')
  end

  fractional_part = parts[1] || '0'

  [integer_part, fractional_part]
end

Private Instance Methods

add_trailing_zeros(s, n) click to toggle source
# File lib/foraneus/converters/float.rb, line 80
def add_trailing_zeros(s, n)
  zeros = '0' * n

  "#{s}#{zeros}"
end