Skip to content

Instantly share code, notes, and snippets.

@bloopletech
Created July 9, 2009 14:54
Show Gist options
  • Save bloopletech/143722 to your computer and use it in GitHub Desktop.
Save bloopletech/143722 to your computer and use it in GitHub Desktop.
Humanize numbers with a 1-999 cache
class Numeric
def humanize
if ONE_TO_NINE_NINETY_NINE_CACHE.length == 1
1.upto(999) do |n|
ONE_TO_NINE_NINETY_NINE_CACHE << if n < 10
HUMANIZE_ONES_TEXT[n]
elsif n < 20
HUMANIZE_ELEVEN2NINETEEN_TEXT[n - 10]
elsif n < 100
d = n % 10
HUMANIZE_TENS_TEXT[n / 10] + (d == 0 ? '' : " " + HUMANIZE_ONES_TEXT[d])
else
q, r = n / 100, n % 100
(q != 0 ? HUMANIZE_ONES_TEXT[q] + ' hundred' : '') + (r != 0 ? (q != 0 && r != 0 ? ' and ' : '') + ONE_TO_NINE_NINETY_NINE_CACHE[r] : '')
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
out << ONE_TO_NINE_NINETY_NINE_CACHE[remainder] if remainder != 0
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_NINE_NINETY_NINE_CACHE = ['X']
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment