module NumbersToWords

Constants

ALL_TENS
LESS_THAN_20
MORE_THAN_THOUSAND
VERSION

Public Instance Methods

to_word() click to toggle source

Convert the current integer number to its English words

# File lib/numbers_to_words.rb, line 8
def to_word
  return convert_2_digits_number(self) if self < 100
  return convert_3_digits_number(self) if self < 1000

  # If number was greater than 1000 we have to look up its suffix
  # in MORE_THAN_THOUSAND constant
  MORE_THAN_THOUSAND.length.times do |i|
    prev_prefix_index = i - 1

    squared_val = 1000 ** i

    if squared_val > self
      prev_squared   = 1000 ** prev_prefix_index
      left           = self / prev_squared
      right          = self - (left * prev_squared)
      thousand_value = MORE_THAN_THOUSAND[prev_prefix_index]

      result = "#{convert_3_digits_number(left)} #{thousand_value}"
      result = "#{result}, #{right.to_word}" if right > 0
      return result
    end
  end
  'Number is in Centillion range.'
end

Private Instance Methods

convert_2_digits_number(value) click to toggle source
# File lib/numbers_to_words.rb, line 36
def convert_2_digits_number(value)

  return LESS_THAN_20[value] if value < 20

  ALL_TENS.length.times do |i|
    word = ALL_TENS[i]
    new_value = 20 + 10 * i

    if new_value + 10 > value
      return "#{word} #{LESS_THAN_20[value % 10]}" if value % 10 > 0
      return word
    end
  end
end
convert_3_digits_number(value) click to toggle source

Convert numbers between 100 and 1000

# File lib/numbers_to_words.rb, line 52
def convert_3_digits_number(value)
  word = ''
  division_result  = value / 100
  mod_result       = value % 100

  if division_result > 0
    word = "#{LESS_THAN_20[division_result]} hundred"
    word = "#{word} " if mod_result > 0
  end

  word = "#{word}#{convert_2_digits_number(mod_result)}" if mod_result > 0
  word
end