Created
May 23, 2018 20:52
-
-
Save thorstenhirsch/c06c89823871af1382a6df1146262a04 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env ruby | |
# | |
class NumberPrinter | |
ONES = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"] | |
TEENS = ["ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"] | |
TENS = ["ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"] | |
TRANSLATION = { hundred: 100, thousand: 1000, million: 1000000, billion: 1000000000} | |
attr_accessor :number | |
def initialize(number) | |
@number = number | |
end | |
def print_english_number | |
print_number(@number) | |
end | |
private | |
def print_number(number) | |
full_number = "" | |
full_number += "negative " if number < 0 | |
number = number.abs | |
if number < 10 | |
full_number += get_ones(number) | |
elsif number < 20 | |
full_number += get_teens(number) | |
elsif number < 100 | |
full_number += get_tens(number) | |
else | |
full_number += get_greater(number) | |
end | |
full_number | |
end | |
def get_ones(number) | |
ONES[number] | |
end | |
def get_teens(number) | |
TEENS[number - 10] | |
end | |
def get_tens(number) | |
tens = number / 10 | |
remainder = get_remainder(number, 10) | |
remainder_text = remainder.is_a?(String) ? " " + remainder.to_s : "" | |
TENS[tens - 1] + remainder_text | |
end | |
def get_greater(number) | |
TRANSLATION.each do |word, divisor| | |
if right_divisor?(number, divisor) | |
text = print_number(number / divisor) | |
remainder = get_remainder(number, divisor) | |
return text + " " + word.to_s + " " + remainder.to_s | |
end | |
end | |
end | |
def right_divisor?(number, divisor) | |
less_thousands?(number, divisor) or thousands_or_more?(number, divisor) | |
end | |
def less_thousands?(number, divisor) | |
divisor < 1000 and (1..9).include?(number / divisor) | |
end | |
def thousands_or_more?(number, divisor) | |
divisor >= 1000 and (1...1000).include?(number / divisor) | |
end | |
def get_remainder(number, divisor) | |
mod = number % divisor | |
remainder = mod > 0 ? print_number(mod) : 0 | |
end | |
end | |
ARGV.each do |arg| | |
nump = NumberPrinter.new(arg.to_i) | |
puts nump.print_english_number | |
end | |
exit 0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment