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