Method: Numeric#to_words
- Defined in:
- lib/epitools/numwords.rb
#to_words ⇒ Object
Convert this number to words (eg: 69 => ‘sixty-nine’). Works with numbers up to a googol (10^100).
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 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 98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/epitools/numwords.rb', line 39 def to_words if is_a? Integer num = self else num = self.to_i end if (n = num.to_s.size) > 102 return "more than a googol! (#{n} digits)" end whole_thing = [] triplets = num.commatize.split(',') num_triplets = triplets.size triplets.each_with_index do |triplet, i| next if triplet.to_i == 0 result = [] tens, hunds = nil, nil digits = triplet.chars.to_a raise "Error: Not a triplet: #{triplet}" if digits.size > 3 or digits.size < 1 if digits.size == 3 digit = digits.shift.to_i hunds = NAMES_SMALL[digit] + "-hundred" if digit > 0 digits.shift if digits.first == '0' end if digits.size == 2 n = digits.join('').to_i if n > 0 and n < 20 tens = NAMES_SMALL[n] elsif n > 0 tens = NAMES_MEDIUM[digits.shift.to_i - 2] if digits.first != '0' tens += "-" + NAMES_SMALL[digits.shift.to_i] else digits.shift end end end if digits.size == 1 n = digits.join('').to_i tens = NAMES_SMALL[n] if n > 0 end if hunds if tens result << "#{hunds} and #{tens}" else result << hunds end else result << tens if tens end magnitude = (num_triplets - i) result << NAMES_LARGE[magnitude-2] if magnitude > 1 whole_thing << result.join(' ') if result.any? end whole_thing.join ', ' end |