module HumanNumbers::English

Public Class Methods

cardinal_factor(n, name, factor) click to toggle source
# File lib/human_numbers/english.rb, line 2
def self.cardinal_factor(n, name, factor)
  cardinal_number(n / factor) + " #{name}" + cardinal_number(n % factor, ' ')
end
cardinal_number(n, prefix='') click to toggle source
# File lib/human_numbers/english.rb, line 6
def self.cardinal_number(n, prefix='')
  return prefix.empty? ? 'zero' : '' if n.zero?
  if n >= HumanNumbers::UPPER_BOUND
    raise ArgumentError, "number too large to print in English: #{n}"
  end

  prefix +
  if    n >= 10 ** 30
    cardinal_factor(n, 'nonillion',   10 ** 30)
  elsif n >= 10 ** 27
    cardinal_factor(n, 'octillion',   10 ** 27)
  elsif n >= 10 ** 24
    cardinal_factor(n, 'septillion',  10 ** 24)
  elsif n >= 10 ** 21
    cardinal_factor(n, 'sextillion',  10 ** 21)
  elsif n >= 10 ** 18
    cardinal_factor(n, 'quintillion', 10 ** 18)
  elsif n >= 10 ** 15
    cardinal_factor(n, 'quadrillion', 10 ** 15)
  elsif n >= 10 ** 12
    cardinal_factor(n, 'trillion',    10 ** 12)
  elsif n >= 10 ** 9
    cardinal_factor(n, 'billion',     10 ** 9)
  elsif n >= 10 ** 6
    cardinal_factor(n, 'million',     10 ** 6)
  elsif n >= 10 ** 3
    cardinal_factor(n, 'thousand',    10 ** 3)
  elsif n >= 10 ** 2
    cardinal_factor(n, 'hundred',     10 ** 2)
  elsif n >= 20
    simple_cardinal(n / 10 * 10) + simple_cardinal(n % 10, '-')
  else
    simple_cardinal(n)
  end
end
ordinal_number(n) click to toggle source
# File lib/human_numbers/english.rb, line 76
def self.ordinal_number(n)
  case n
  when  1; 'first'
  when  2; 'second'
  when  3; 'third'
  when  4; 'fourth'
  when  5; 'fifth'
  when  8; 'eighth'
  when  9; 'ninth'
  when 12; 'twelfth'
  else
    if n > 10 && n < 100 && n % 10 == 0
      simple_cardinal(n)[0..-2] + 'ieth'
    elsif n >= 20 && n < 100
      simple_cardinal(n / 10 * 10) + '-' + ordinal_number(n % 10)
    elsif n > 100
      rem = n % 100
      cardinal_number(n / 100 * 100) +
        (rem.zero? ? 'th' : ' ' + ordinal_number(rem))
    else
      cardinal_number(n) + 'th'
    end
  end
end
simple_cardinal(n, prefix='') click to toggle source
# File lib/human_numbers/english.rb, line 42
def self.simple_cardinal(n, prefix='')
  return '' if n.zero?
  prefix +
  case n
  when  1; 'one'
  when  2; 'two'
  when  3; 'three'
  when  4; 'four'
  when  5; 'five'
  when  6; 'six'
  when  7; 'seven'
  when  8; 'eight'
  when  9; 'nine'
  when 10; 'ten'
  when 11; 'eleven'
  when 12; 'twelve'
  when 13; 'thirteen'
  when 14; 'fourteen'
  when 15; 'fifteen'
  when 16; 'sixteen'
  when 17; 'seventeen'
  when 18; 'eighteen'
  when 19; 'nineteen'
  when 20; 'twenty'
  when 30; 'thirty'
  when 40; 'forty'
  when 50; 'fifty'
  when 60; 'sixty'
  when 70; 'seventy'
  when 80; 'eighty'
  when 90; 'ninety'
  end
end