Created
July 7, 2009 00:16
-
-
Save bloopletech/141786 to your computer and use it in GitHub Desktop.
Humanize numbers with a 1-99 cache
This file contains hidden or 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
class Numeric | |
def humanize | |
if ONE_TO_NINETY_NINE_CACHE.length == 1 | |
1.upto(99) do |n| | |
ONE_TO_NINE_NINETY_NINE_CACHE << if n < 10 | |
HUMANIZE_ONES_TEXT[n] | |
elsif n > 9 && n < 20 | |
HUMANIZE_ELEVEN2NINETEEN_TEXT[n - 10] | |
else | |
d = n % 10 | |
HUMANIZE_TENS_TEXT[n / 10] + (d == 0 ? '' : " " + HUMANIZE_ONES_TEXT[d]) | |
end | |
end | |
end | |
num, output = self.to_i, '' | |
if self < 0 | |
output << 'negative ' | |
num = -num | |
end | |
output << if self == 0 | |
'zero' | |
else | |
out, quotient, i, last_had = [], 1, 0, false | |
while quotient != 0 | |
quotient, remainder = num / 1000, num % 1000 | |
out << (HUMANIZE_GROUP_TEXT[i] + (!out.empty? ? (last_had ? " and" : ",") : "")) unless remainder == 0 || i == 0 | |
last_had = true if i == 0 && remainder < 100 | |
i += 1 | |
if remainder != 0 | |
q, r = remainder / 100, remainder % 100 | |
out << (q != 0 ? HUMANIZE_ONES_TEXT[q] + ' hundred' : '') + (r != 0 ? (q != 0 && r != 0 ? ' and ' : '') + ONE_TO_NINETY_NINE_CACHE[r] : '') | |
end | |
num = quotient | |
end | |
out.reverse.join(' ').strip | |
end | |
output << " point " << self.to_s.split('.', 2).last.scan(/./).map { |n| HUMANIZE_ONES_TEXT[n.to_i] }.join(' ') if self % 1 != 0 | |
output | |
end | |
private | |
HUMANIZE_GROUP_TEXT = [''] + %w(thousand million billion trillion quadrillion quintrillion sextillion septillion octillion nonillion decillion undecillion | |
duodecillion tredecillion quattuordecillion quindecillion sexdecillion septendecillion octodecillion novemdecillion vigintillion unvigintillion | |
duovigintillion trevigintillion quattuortillion quinvigintillion sexvigintillion septenvigintillion octovigintillion novemvigintillion trigintillion | |
untrigintillion duotrigintillion trestrigintillion quattuortrigintillion quintrigintillion sextrigintillion septentrigintillion octotrigintillion | |
novemtrigintillion quadragintillion unquadragintillion duoquadragintillion trequadragintillion quattuorquadragintillion quinquadragintillion | |
sesquadragintillion septenquadragintillion octoquadragintillion novenquadragintillion quinquagintillion).freeze | |
HUMANIZE_TENS_TEXT = %w(X X twenty thirty forty fifty sixty seventy eighty ninety).freeze | |
HUMANIZE_ELEVEN2NINETEEN_TEXT = %w(ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen).freeze | |
HUMANIZE_ONES_TEXT = %w(zero one two three four five six seven eight nine).freeze | |
ONE_TO_NINETY_NINE_CACHE = ['X'] | |
end | |
#[1, 5, 9, 10, 100, 1000, 1500, 2000, 10000, 19999, 100000, 1023456, 103, 1003, 10003, 100003, 1000003, 10000003, 100000003].each { |n| puts n.humanize } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment