class Formatter::Number

Number formatter

Gem version

Constants

DEFAULTS
VERSION

Public Class Methods

new(options = { }.freeze) click to toggle source

Initialize a formatter with the desired options.

@param [Hash] options the options to create a formatter with @option options [Integer] :decimals (2) Number of decimal points @option options [Boolean] :fixed (false) Fixed decimal places @option options [String] :separator (‘.’) Decimal mark @option options [Integer] :grouping (3) Number of digits per group @option options [String] :delimiter (‘,’) Delimiter between groups

# File lib/formatter/number.rb, line 22
def initialize(options = { }.freeze)
  @options = defaults.merge(options)
end

Public Instance Methods

format(number) click to toggle source
# File lib/formatter/number.rb, line 26
def format(number)
  case number
  when Float then format_float(number)
  when Integer then format_integer(number)
  else fail ArgumentError
  end
end

Private Instance Methods

decimals() click to toggle source
# File lib/formatter/number.rb, line 66
def decimals
  @options.fetch :decimals
end
defaults() click to toggle source
# File lib/formatter/number.rb, line 62
def defaults
  DEFAULTS
end
delimit(number) click to toggle source
# File lib/formatter/number.rb, line 51
def delimit(number)
  if grouping == 2
    # When grouped by two the first group is by three and the rest of them
    # are grouped by two. This is according to the Indian Numbering System.
    number.to_s.gsub(/(\d+?)(?=(\d\d)+(\d)(?!\d))(\.\d+)?/, "\\1#{delimiter}")
  else
    group = '\d' * grouping
    number.to_s.gsub(/(\d)(?=(#{group})+(?!\d))/, "\\1#{delimiter}")
  end
end
delimiter() click to toggle source
# File lib/formatter/number.rb, line 82
def delimiter
  @options.fetch :delimiter
end
fixed?() click to toggle source
# File lib/formatter/number.rb, line 70
def fixed?
  @options.fetch :fixed
end
format_float(number) click to toggle source
# File lib/formatter/number.rb, line 35
def format_float(number)
  if fixed?
    number = "%0.0#{decimals}f" % number
  else
    number = number.round(decimals)
  end

  number = number.to_s.gsub('.', separator)

  delimit(number)
end
format_integer(number) click to toggle source
# File lib/formatter/number.rb, line 47
def format_integer(number)
  delimit(number)
end
grouping() click to toggle source
# File lib/formatter/number.rb, line 78
def grouping
  @options.fetch :grouping
end
separator() click to toggle source
# File lib/formatter/number.rb, line 74
def separator
  @options.fetch :separator
end