77 lines
1.6 KiB
Ruby
77 lines
1.6 KiB
Ruby
module NumberToWord
|
|
|
|
NUMBERS = { # taken from https://en.wikipedia.org/wiki/Names_of_large_numbers#cite_ref-a_14-3
|
|
1 => 'one',
|
|
2 => 'two',
|
|
3 => 'three',
|
|
4 => 'four',
|
|
5 => 'five',
|
|
6 => 'six',
|
|
7 => 'seven',
|
|
8 => 'eight',
|
|
9 => 'nine',
|
|
10 => 'ten',
|
|
11 => 'eleven',
|
|
12 => 'twelve',
|
|
13 => 'thirteen',
|
|
14 => 'fourteen',
|
|
15 => 'fifteen',
|
|
16 => 'sixteen',
|
|
17 => 'seventeen',
|
|
18 => 'eighteen',
|
|
19 => 'nineteen',
|
|
20 => 'twenty',
|
|
30 => 'thirty',
|
|
40 => 'forty',
|
|
50 => 'fifty',
|
|
60 => 'sixty',
|
|
70 => 'seventy',
|
|
80 => 'eighty',
|
|
90 => 'ninety',
|
|
100 => 'hundred',
|
|
1000 => 'thousand',
|
|
10 ** 6 => 'million',
|
|
10 ** 9 => 'billion',
|
|
10 ** 12 => 'trillion',
|
|
10 ** 15 => 'quadrillion',
|
|
10 ** 18 => 'quintillion',
|
|
10 ** 21 => 'sextillion',
|
|
10 ** 24 => 'septillion',
|
|
10 ** 27 => 'octillion',
|
|
10 ** 30 => 'nonillion',
|
|
10 ** 33 => 'decillion'}.reverse_each.to_h
|
|
|
|
refine Integer do
|
|
def to_english
|
|
return 'zero' if i.zero?
|
|
words = self < 0 ? ['negative'] : []
|
|
i = self.abs
|
|
NUMBERS.each do |k, v|
|
|
if k <= i then
|
|
times = i/k
|
|
words << times.to_english if k >= 100
|
|
words << v
|
|
i -= times * k
|
|
end
|
|
return words.join(" ") if i.zero?
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
using NumberToWord
|
|
|
|
def magic4(n)
|
|
words = []
|
|
until n == 4
|
|
s = n.to_english
|
|
n = s.size
|
|
words << "#{s} is #{n.to_english}"
|
|
end
|
|
words << "four is magic."
|
|
words.join(", ").capitalize
|
|
end
|
|
|
|
[0, 4, 6, 11, 13, 75, 337, -164, 9_876_543_209].each{|n| puts magic4(n) }
|