Skip to content

Instantly share code, notes, and snippets.

@nitishparkar
Created June 27, 2020 14:57
Show Gist options
  • Save nitishparkar/87ee3cb350b48eead7a4455b236df9c8 to your computer and use it in GitHub Desktop.
Save nitishparkar/87ee3cb350b48eead7a4455b236df9c8 to your computer and use it in GitHub Desktop.
Convert a number into english words (Indian numbering system) in ruby
# https://stackoverflow.com/a/43522719 + couple of fixes
def number_to_words(num)
numbers_to_name = {
10_000_000 => "crore",
100_000 => "lakh",
1000 => "thousand",
100 => "hundred",
90 => "ninety",
80 => "eighty",
70 => "seventy",
60 => "sixty",
50 => "fifty",
40 => "forty",
30 => "thirty",
20 => "twenty",
19 => "nineteen",
18 => "eighteen",
17 => "seventeen",
16 => "sixteen",
15 => "fifteen",
14 => "fourteen",
13 => "thirteen",
12 => "twelve",
11 => "eleven",
10 => "ten",
9 => "nine",
8 => "eight",
7 => "seven",
6 => "six",
5 => "five",
4 => "four",
3 => "three",
2 => "two",
1 => "one"
}
log_floors_to_ten_powers = {
0 => 1,
1 => 10,
2 => 100,
3 => 1000,
4 => 1000,
5 => 100_000,
6 => 100_000,
7 => 10_000_000
}
num = num.to_i
return '' if (num <= 0) || (num >= 100_000_000)
log_floor = Math.log(num, 10).round(15).floor
ten_power = log_floors_to_ten_powers[log_floor]
if num <= 20
numbers_to_name[num]
elsif log_floor == 1
rem = num % 10
[numbers_to_name[num - rem], number_to_words(rem)].join(' ')
else
[number_to_words(num / ten_power), numbers_to_name[ten_power], number_to_words(num % ten_power)].join(' ').strip
end
end
@nitishparkar
Copy link
Author

Workaround for floating point error in Math.log output taken from here - https://stackoverflow.com/a/56370318/923080

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment