Method: Numeric#to_words

Defined in:
lib/epitools/numwords.rb

#to_wordsObject

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