Module: Formatting::Number

Included in:
Formatting, Currency
Defined in:
lib/formatting/number.rb

Instance Method Summary collapse

Instance Method Details

#format_number(number, opts = {}) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/formatting/number.rb', line 3

def format_number(number, opts = {})
  opts = Formatting.defaults.merge(opts)

  thousands_separator = opts.fetch(:thousands_separator, NON_BREAKING_SPACE)
  decimal_separator   = opts.fetch(:decimal_separator, ".")
  round           = opts.fetch(:round, nil)
  min_decimals    = opts.fetch(:min_decimals, nil)
  explicit_sign   = opts.fetch(:explicit_sign, false)
  blank_when_zero = opts.fetch(:blank_when_zero, false)

  if blank_when_zero
    return "" if number.zero?
  end

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

  if round
    number = number.round(round)
  end

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

  integer.gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{thousands_separator}")

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

  if min_decimals
    decimals = decimals.ljust(min_decimals, "0")
  end

  [integer, decimals].join(decimal_separator)
end