Skip to content

Instantly share code, notes, and snippets.

@scottchiang
Created October 11, 2012 00:32
Show Gist options
  • Save scottchiang/3869424 to your computer and use it in GitHub Desktop.
Save scottchiang/3869424 to your computer and use it in GitHub Desktop.
Numbers in Words
def in_words(n)
@ones = {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"
}
@twos = {2 => "twenty", 3 => "thirty", 4 => "forty", 5 => "fifty", 6 => "sixty",
7 => "seventy", 8 => "eighty", 9 => "ninety"
}
@scale = {1 => "thousand", 2 => "million", 3 => "billion", 4 => "trillion", 5 => "quadrillion",
6 => "quintillion", 7 => "sextillion", 8 => "septillion", 9 => "octillion",
10 => "nonillion", 11 => "decillion", 12 => "undecillion"}
@counter = 0
@word = String.new
n_string = n.to_s
n_string == "0" ? @word = "zero" :
until n_string.length < 3
set_of_threes = n_string[-3,3]
set_of_threes = set_of_threes.to_i
hundreds_place = set_of_threes / 100
hundreds_rem = set_of_threes % 100
tens_rem = set_of_threes % 1000
if hundreds_rem < 20 && tens_rem > 0
@word = @word.insert(0,"#{@ones[hundreds_rem]} #{@scale[@counter]} ")
elsif hundreds_place > 0
tens_place = hundreds_rem / 10
tens_rem = hundreds_rem % 10
@word = @word.insert(0,"#{@twos[tens_place]} #{@ones[tens_rem]} #{@scale[@counter]} ")
end
if hundreds_place > 0
@word = @word.insert(0,"#{@ones[hundreds_place]} hundred ")
end
n_string.slice!(-3,3)
@counter += 1
end
if n_string != ""
leftover_digits = n_string.to_i
if leftover_digits < 20
@word = @word.insert(0, "#{@ones[leftover_digits]} #{@scale[@counter]} ")
else
tens_place = leftover_digits / 10
tens_rem = leftover_digits % 10
@word = @word.insert(0,"#{@twos[tens_place]} #{@ones[tens_rem]} #{@scale[@counter]} ")
end
end
@word
end
puts in_words(123_456_789_123_456)
### recursive version
@ones = {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"
}
@twos = {2 => "twenty", 3 => "thirty", 4 => "forty", 5 => "fifty", 6 => "sixty",
7 => "seventy", 8 => "eighty", 9 => "ninety"
}
@scale = {1 => "thousand", 2 => "million", 3 => "billion", 4 => "trillion", 5 => "quadrillion",
6 => "quintillion", 7 => "sextillion", 8 => "septillion", 9 => "octillion",
10 => "nonillion", 11 => "decillion", 12 => "undecillion"}
@counter = 0
@word = String.new
def in_words_recursive(n)
n_string = n.to_s
if n_string.length < 3
if n_string != ""
leftover_digits = n_string.to_i
if leftover_digits < 20 && leftover_digits > 0
@word = @word.insert(0, "#{@ones[leftover_digits]} #{@scale[@counter]} ")
elsif leftover_digits >= 20
tens_place = leftover_digits / 10
tens_rem = leftover_digits % 10
@word = @word.insert(0,"#{@twos[tens_place]} #{@ones[tens_rem]} #{@scale[@counter]} ")
end
end
return @word
end
set_of_threes = n_string[-3,3]
set_of_threes = set_of_threes.to_i
hundreds_place = set_of_threes / 100
hundreds_rem = set_of_threes % 100
tens_rem = set_of_threes % 1000
if hundreds_rem < 20 && tens_rem > 0
@word = @word.insert(0,"#{@ones[hundreds_rem]} #{@scale[@counter]} ")
elsif tens_rem > 0
tens_place = hundreds_rem / 10
tens_rem = hundreds_rem % 10
@word = @word.insert(0,"#{@twos[tens_place]} #{@ones[tens_rem]} #{@scale[@counter]} ")
end
if hundreds_place > 0
@word = @word.insert(0,"#{@ones[hundreds_place]} hundred ")
end
n_string.slice!(-3,3)
n = n_string.to_i
@counter += 1
in_words_recursive(n)
end
puts in_words_recursive(108_229_815_000_731_090_101_002_981_456_004)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment