class Sankhya::Numbers

Public Class Methods

amount(number, options) click to toggle source
# File lib/sankhya/numbers.rb, line 19
def self.amount(number, options)
  parse options

  numbers = format "%.#{@scale}f", number
  integers, decimals = numbers.split('.')

  result = []
  result << integers.reverse[3..-1].to_s.gsub(/(\d{2})(?=\d)/, '\\1,').reverse
  result << integers.reverse[0..2].reverse

  result.select { |x| !x.empty? }.join(',') + '.' + decimals
end
translate(number, options) click to toggle source
# File lib/sankhya/numbers.rb, line 7
def self.translate(number, options)
  parse options

  if number.integer?
    words_of(number)
  else # if float
    integer = number.floor
    decimal = (number * (10**@scale)).floor - (integer * (10**@scale))
    [words_of(integer), words_of(decimal)]
  end
end

Private Class Methods

number?(number) click to toggle source
# File lib/sankhya/numbers.rb, line 35
def number?(number)
  true if Float(number) rescue false
end
parse(options) click to toggle source
# File lib/sankhya/numbers.rb, line 39
def parse(options)
  @comma = options.key?(:comma) ? options[:comma] : true
  @scale = number?(options[:scale]) ? ([options[:scale], 0].max) : 2
end
words_of(number) click to toggle source
# File lib/sankhya/numbers.rb, line 44
def words_of(number)
  if number < 20
    to_english(number)
  else
    words = []

    units = [{ divisor: 100, prefix: ', and' },
             { divisor: 10,  suffix: 'hundred,' },
             { divisor: 100, suffix: 'thousand,' },
             { divisor: 100, suffix: 'lakh,' }]

    i = 0
    while i < units.length
      number, segment = number.divmod(units[i][:divisor])
      parts = segment < 20 ? segment.divmod(100) : segment.divmod(10)

      words << units[i][:suffix]            if units[i][:suffix] && segment.positive?
      words << to_english(parts.last)       if parts.last.positive?
      words << to_english(10 * parts.first) if parts.first.positive?
      words << units[i][:prefix]            if units[i][:prefix] && segment.positive? && number.positive?

      if i == units.length - 1 && number.positive?
        # suffix crore and start over
        words << 'crore,'
        i = 0
      else
        i += 1
      end
    end

    regex = @comma ? /, ,|,$/ : /, ,|,/
    words.reverse.join(' ').gsub(/#{regex}/, '')
  end
end