Skip to content

Instantly share code, notes, and snippets.

@khanh101
Created May 5, 2023 03:49
Show Gist options
  • Save khanh101/d2b03bde7d9349789cbf66f3e20dec50 to your computer and use it in GitHub Desktop.
Save khanh101/d2b03bde7d9349789cbf66f3e20dec50 to your computer and use it in GitHub Desktop.
# code stole from: https://stackoverflow.com/a/54018199/21613605
ones = {
0: '', 1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five', 6: 'six',
7: 'seven', 8: 'eight', 9: 'nine', 10: 'ten', 11: 'eleven', 12: 'twelve',
13: 'thirteen', 14: 'fourteen', 15: 'fifteen', 16: 'sixteen',
17: 'seventeen', 18: 'eighteen', 19: 'nineteen'}
tens = {
2: 'twenty', 3: 'thirty', 4: 'forty', 5: 'fifty', 6: 'sixty',
7: 'seventy', 8: 'eighty', 9: 'ninety'}
illions = {
1: 'thousand', 2: 'million', 3: 'billion', 4: 'trillion', 5: 'quadrillion',
6: 'quintillion', 7: 'sextillion', 8: 'septillion', 9: 'octillion',
10: 'nonillion', 11: 'decillion'}
def say_number(i):
"""
Convert an integer in to it's word representation.
say_number(i: integer) -> string
"""
if i < 0:
return _join('negative', _say_number_pos(-i))
if i == 0:
return 'zero'
return _say_number_pos(i)
def _say_number_pos(i):
if i < 20:
return ones[i]
if i < 100:
return _join(tens[i // 10], ones[i % 10])
if i < 1000:
return _divide(i, 100, 'hundred')
for illions_number, illions_name in illions.items():
if i < 1000**(illions_number + 1):
break
return _divide(i, 1000**illions_number, illions_name)
def _divide(dividend, divisor, magnitude):
return _join(
_say_number_pos(dividend // divisor),
magnitude,
_say_number_pos(dividend % divisor),
)
def _join(*args):
return ' '.join(filter(bool, args))
if __name__ == "__main__":
def test_say_number(data, expected_output):
"""Test cases for say_number(i)."""
output = say_number(data)
assert output == expected_output, \
"\n for: {}\n expected: {}\n got: {}".format(
data, expected_output, output)
test_say_number(0, 'zero')
test_say_number(1, 'one')
test_say_number(-1, 'negative one')
test_say_number(10, 'ten')
test_say_number(11, 'eleven')
test_say_number(99, 'ninety nine')
test_say_number(100, 'one hundred')
test_say_number(111, 'one hundred eleven')
test_say_number(999, 'nine hundred ninety nine')
test_say_number(1119, 'one thousand one hundred nineteen')
test_say_number(999999,
'nine hundred ninety nine thousand nine hundred ninety nine')
test_say_number(9876543210,
'nine billion eight hundred seventy six million '
'five hundred forty three thousand two hundred ten')
test_say_number(1000**1, 'one thousand')
test_say_number(1000**2, 'one million')
test_say_number(1000**3, 'one billion')
test_say_number(1000**4, 'one trillion')
test_say_number(1000**5, 'one quadrillion')
test_say_number(1000**6, 'one quintillion')
test_say_number(1000**7, 'one sextillion')
test_say_number(1000**8, 'one septillion')
test_say_number(1000**9, 'one octillion')
test_say_number(1000**10, 'one nonillion')
test_say_number(1000**11, 'one decillion')
test_say_number(1000**12, 'one thousand decillion')
test_say_number(
1-1000**12,
'negative nine hundred ninety nine decillion nine hundred ninety nine '
'nonillion nine hundred ninety nine octillion nine hundred ninety nine '
'septillion nine hundred ninety nine sextillion nine hundred ninety nine '
'quintillion nine hundred ninety nine quadrillion nine hundred ninety '
'nine trillion nine hundred ninety nine billion nine hundred ninety nine'
' million nine hundred ninety nine thousand nine hundred ninety nine')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment