Skip to content

Instantly share code, notes, and snippets.

@lsegal
Created January 13, 2012 23:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lsegal/1609342 to your computer and use it in GitHub Desktop.
Save lsegal/1609342 to your computer and use it in GitHub Desktop.
class NumberToString
SINGLE_MAPPING = {'1' => 'one', '2' => 'two', '3' => 'three',
'4' => 'four', '5' => 'five', '6' => 'six',
'7' => 'seven', '8' => 'eight', '9' => 'nine', '0' => 'zero'}
DECI_MAPPING = {'1' => 'ten', '2' => 'twenty', '3' => 'thirty',
'4' => 'forty', '5' => 'fifty', '6' => 'sixty',
'7' => 'seventy', '8' => 'eighty', '9' => 'ninety'}
HUNDRED_MAPPING = Proc.new {|n| n == '0' ? '' : SINGLE_MAPPING[n] + " hundred" }
MAPPINGS = [SINGLE_MAPPING, DECI_MAPPING, HUNDRED_MAPPING]
TRIPLET_MAPPING = {
1 => "",
2 => " thousand",
3 => " million",
4 => " billion",
5 => " trillion"
}
def convert(number, triplet = '')
number = number.to_s
if number.size > 3
enum = number.split(//).reverse.each_slice(3).map {|t| t.reverse }
return enum.map.with_index do |t, i|
convert(t.join, TRIPLET_MAPPING[i+1])
end.compact.reverse.join(" ")
end
return nil if number =~ /^00+$/
0.upto(number.size - 1).map do |index|
MAPPINGS[index][number[number.size - 1 - index]]
end.reverse.join(" ").strip + triplet
end
end
puts NumberToString.new.convert('1000335')
# => "one million three hundred thirty five"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment