Created
May 5, 2023 03:49
-
-
Save khanh101/d2b03bde7d9349789cbf66f3e20dec50 to your computer and use it in GitHub Desktop.
This file contains 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
# 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