Skip to content

Instantly share code, notes, and snippets.

@samflores
Last active September 21, 2016 15:12
Show Gist options
  • Save samflores/6f79b681e6a7167bf15d43083c39c85f to your computer and use it in GitHub Desktop.
Save samflores/6f79b681e6a7167bf15d43083c39c85f to your computer and use it in GitHub Desktop.
class PortugueseNumbers
class OutOfRange < StandardError; end
SMALLER_POWERS = {
10**0 => ['', 'um', 'dois', 'tres', 'quatro', 'cinco', 'seis', 'sete', 'oito', 'nove'],
10**1 => ['', 'dez', 'vinte', 'trinta', 'quarenta', 'cinquenta', 'sessenta', 'setenta', 'oitenta', 'noventa'],
10**2 => ['', 'cento', 'duzentos', 'trezentos', 'quatrocentos', 'quinhentos', 'seiscentos', 'setecentos', 'oitocentos', 'novecentos']
}
BIGGER_POWERS = {
10**3 => ['mil', 'mil'],
10**6 => ['milhao', 'milhoes'],
10**9 => ['bilhao', 'bilhoes'],
10**12 => ['trilhao', 'trilhoes'],
# ... dá pra adicionar mais aqui seguindo o mesmo padrão
}
TEENS = ['', 'onze', 'doze', 'treze', 'quatorze', 'quinze', 'dezesseis', 'dezesete', 'dezoito', 'dezenove']
def self.to_s(number)
write_number(number)
end
private
def self.write_number(number)
number < 1000 ? below_thousand(number) : above_thousand(number)
end
def self.pluralize(labels, number)
number == 1 ? labels.first : labels.last
end
def self.above_thousand(number)
power = find_big_power(number)
div, rest = number / power, number % power
power_label = pluralize(BIGGER_POWERS[power], div)
"#{below_thousand(div)} #{power_label} #{write_number(rest)}"
end
def self.below_thousand(number)
raise OutOfRange if number > 999
case number
when 100 then 'cem'
when 11..19 then TEENS[number-10]
else
power = find_small_power(number)
div, rest = number / power, number % power
labels = SMALLER_POWERS[power]
"#{labels[div]}#{' e ' + below_thousand(rest) if rest > 0}"
end
end
def self.find_power(number, powers)
powers.find { |power| number / power > 0 }
end
def self.find_big_power(number)
find_power(number, big_powers)
end
def self.find_small_power(number)
find_power(number, small_powers)
end
def self.big_powers
@_big_powers ||= BIGGER_POWERS.keys.sort.reverse
end
def self.small_powers
@_small_powers ||= SMALLER_POWERS.keys.sort.reverse
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment