Method: Humanize.process_decimals

Defined in:
lib/humanize/module.rb

.process_decimals(number, locale_class, locale, parts, decimals_as, spacer) ⇒ Object

rubocop:disable Metrics/ParameterLists



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/humanize/module.rb', line 66

def process_decimals(number, locale_class, locale, parts, decimals_as, spacer)
  # rubocop:enable Metrics/ParameterLists
  return unless number.is_a?(Float) || number.is_a?(BigDecimal)

  # Why 15?
  # (byebug) BigDecimal.new(number, 15)
  # 0.8000015e1
  # (byebug) BigDecimal.new(number, 16)
  # 0.8000014999999999e1
  decimal = BigDecimal(number, 15) - BigDecimal(number.to_i)

  _sign, significant_digits, _base, exponent = decimal.split
  return if significant_digits == "0"

  grouping = locale_class::SUB_ONE_GROUPING
  leading_zeroes = [grouping[0]] * exponent.abs
  decimals_as = :digits if leading_zeroes.any?

  decimals_as_words =
    case decimals_as
    when :digits
      digits = significant_digits.chars.map do |num|
        grouping[num.to_i]
      end

      (leading_zeroes + digits).join(spacer)
    when :number
      Humanize.format(significant_digits.to_i, locale:)
    end

  parts.insert(0, decimals_as_words, locale_class::POINT)
end