Краткий ответ: не делайте этого сами , найдите библиотеку , которая сделает это за вас.
Однако, это может быть крутоупражнение и это на самом деле интересная проблема.Итак, игнорируя лучшие практики не изобретать велосипед ... Вам, вероятно, придется относиться к сотням и тысячам по-разному, потому что вы можете сказать «двести», но «два семидесяти» на самом деле не имеет особого смысла.
Вот моя плохо проверенная, неоптимизированная попытка.Это доказательство концепции , и я почти уверен, что пропустил многие случаи.Если вам нужна дополнительная помощь, попробуйте прочитать исходный код .
других людей. Сначала мы определяем два хэша, один для чисел, другой для величин (которые различаются, поскольку перед ними могут стоять префиксы с числами вчтобы умножить их).
class Integer
NUMBERS = {
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"
}
MAGNITUDES = {
100 => "hundred",
1000 => "thousand",
1000_000 => "million"
}
end
Далее определите метод преобразования.
class Integer
def to_text
return nil if self == 0
if NUMBERS.keys.include? self
NUMBERS[self]
elsif self < MAGNITUDES.keys.first
base = maximum_fitting(NUMBERS, self)
[NUMBERS[base], (self - base).to_text].compact * "-"
else
base = maximum_fitting(MAGNITUDES, self)
quo, mod = self.divmod(base)
[quo.to_text, MAGNITUDES[base], mod.to_text].compact * " "
end
end
private
def maximum_fitting(list, number)
list.keys.select { |n| n <= number }.last
end
end
Чтобы использовать его:
puts 2351.to_text
#=> "two thousand three hundred fifty-one"
puts 14330132.to_text
#=> "fourteen million three hundred thirty thousand one hundred thirty-two"
puts 1000000.to_text
#=> "one million"