class Formatting::FormatNumber

Public Class Methods

new(input_number, opts) click to toggle source
# File lib/formatting/number.rb, line 17
def initialize(input_number, opts)
  @input_number = input_number

  @thousands_separator  = opts.fetch(:thousands_separator) { default_thousands_separator }
  @decimal_separator    = opts.fetch(:decimal_separator) { default_decimal_separator }
  @round                = opts.fetch(:round, 2)
  @min_decimals         = opts.fetch(:min_decimals, 2)
  @decimals_on_integers = opts.fetch(:decimals_on_integers, true)
  @treat_zero_decimals_as_integer = opts.fetch(:treat_zero_decimals_as_integer, false)
  @explicit_sign        = opts.fetch(:explicit_sign, false)
  @blank_when_zero      = opts.fetch(:blank_when_zero, false)
end

Public Instance Methods

format() click to toggle source
# File lib/formatting/number.rb, line 30
def format
  number = input_number

  if treat_zero_decimals_as_integer && number.modulo(1).zero?
    number = number.to_i
  end

  has_decimals = number.to_s.include?(".")

  if blank_when_zero
    return "" if number.zero?
  end

  # Avoid negative zero.
  number = number.abs if number.zero?

  if round
    number = number.round(round) if has_decimals
  end

  integer, decimals = number.to_s.split(".")

  # Separate groups by thousands separator.
  integer.gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{thousands_separator}")

  if explicit_sign
    integer = "+#{integer}" if number > 0
  end

  if min_decimals && (has_decimals || decimals_on_integers)
    decimals ||= "0"
    decimals = decimals.ljust(min_decimals, "0")
  end

  [ integer, decimals ].compact.join(decimal_separator)
end

Private Instance Methods

default_decimal_separator() click to toggle source
# File lib/formatting/number.rb, line 73
def default_decimal_separator
  t_format(:separator, ".")
end
default_thousands_separator() click to toggle source
# File lib/formatting/number.rb, line 69
def default_thousands_separator
  t_format(:delimiter, NON_BREAKING_SPACE)
end
t_format(key, default) click to toggle source
# File lib/formatting/number.rb, line 77
def t_format(key, default)
  if defined?(I18n) && I18n.respond_to?(:t)
    I18n.t(key, scope: "number.format", default: default)
  else
    default
  end
end