Skip to content

Instantly share code, notes, and snippets.

@Techcable
Created May 6, 2017 19:00
Show Gist options
  • Select an option

  • Save Techcable/cc52c4a44de02b9d122e46eb677512dc to your computer and use it in GitHub Desktop.

Select an option

Save Techcable/cc52c4a44de02b9d122e46eb677512dc to your computer and use it in GitHub Desktop.
Python Pretty Print Numbers
from math import floor, log10
tinyNumbers = {
1: "one",
2: "two",
3: "three",
4: "four",
5: "five",
6: "six",
7: "seven",
8: "eight",
9: "nine"
}
teens = {
11: "eleven",
12: "twelve",
13: "thirteen",
14: "fourteen",
15: "fifteen",
16: "sixteen",
17: "seventeen",
18: "eighteen",
19: "nineteen",
}
multiplesOf10 = {
10: "ten",
20: "twenty",
30: "thirty",
40: "forty",
50: "fifty",
60: "sixty",
70: "seventy",
80: "eighty",
90: "ninety",
}
powersOf10 = {
10**2: "hundred",
10**3: "thousand",
10**6: "million",
10**9: "billion",
10**12: "trillion"
}
def prettyPrintNumber(num):
assert num > 0, "Humans don't like {}".format(num)
if num < 10:
return tinyNumbers[num]
elif num < 20 and num > 10:
# Stupid humans insisting on special cases -_-
return teens[num]
elif num < 100:
mult, remainder = divmod(num, 10)
multStr = multiplesOf10[10*mult]
parts = [multStr]
if remainder > 0:
parts.append(tinyNumbers[remainder])
return ' '.join(parts)
else:
power = floor(log10(num))
powerValue = 10**power
while powerValue not in powersOf10:
assert power > 2
power -= 1
powerValue = 10**power
powerName = powersOf10[powerValue]
powerMultiple, remainder = divmod(num, powerValue)
assert powerMultiple < 1000, "Too large: {}".format(num)
parts = [
prettyPrintNumber(powerMultiple),
powerName
]
if remainder > 0:
if remainder < 100:
parts.append("and")
parts.append(prettyPrintNumber(remainder))
return ' '.join(parts)
def commaSeperated(num):
digits = str(num)
results = []
remainder = len(digits) % 3
if remainder:
results.append(digits[:remainder])
for index in range(remainder, len(digits), 3):
results.append(digits[index:index + 3])
return ','.join(results)
for testValue in (100, 342, 76, 1000000, 1307, 1046, 13, 13000):
print("Pretty {}: {}".format(
commaSeperated(testValue),
prettyPrintNumber(testValue)
))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment