"""
Convert numbers to English words in Python
------------------------------------------
Supports numbers from 0 to 999,999,999,999,999.
Strategy:
- Break the number into named groups: trillions, billions, millions,
thousands, hundreds.
- Convert each 0–999 group using a helper function.
- Append group names ("trillion", "billion", etc.) when needed.
- Build the final string with proper spacing.
The program is fully commented to explain each step clearly.
"""
ONES = [
"zero", "one", "two", "three", "four",
"five", "six", "seven", "eight", "nine",
"ten", "eleven", "twelve", "thirteen", "fourteen",
"fifteen", "sixteen", "seventeen", "eighteen", "nineteen"
]
TENS_WORDS = [
"", "", "twenty", "thirty", "forty",
"fifty", "sixty", "seventy", "eighty", "ninety"
]
def append_word(out: list, word: str) -> None:
"""
Append a word to the output list.
Using a list and joining at the end
to build strings efficiently.
"""
if word:
out.append(word)
def convert_hundreds(n: int, out: list) -> None:
"""
Convert numbers from 0 to 999 into words.
"""
if n == 0:
return
if n >= 100:
append_word(out, ONES[n // 100])
append_word(out, "hundred")
n %= 100
if n > 0:
append_word(out, "and")
if n >= 20:
append_word(out, TENS_WORDS[n // 10])
if n % 10:
append_word(out, ONES[n % 10])
elif n > 0:
append_word(out, ONES[n])
def number_to_words(num: int) -> str:
"""
Convert any number from 0 to 999,999,999,999,999 into English words.
"""
if num == 0:
return "zero"
out: list[str] = []
trillions = num // 1_000_000_000_000
billions = (num // 1_000_000_000) % 1000
millions = (num // 1_000_000) % 1000
thousands = (num // 1_000) % 1000
hundreds = num % 1000
if trillions:
convert_hundreds(trillions, out)
append_word(out, "trillion")
if billions:
convert_hundreds(billions, out)
append_word(out, "billion")
if millions:
convert_hundreds(millions, out)
append_word(out, "million")
if thousands:
convert_hundreds(thousands, out)
append_word(out, "thousand")
if hundreds:
convert_hundreds(hundreds, out)
return " ".join(out)
def main() -> None:
"""
Demonstrates usage with multiple test numbers.
"""
tests = [
1_234,
12_345,
123_456,
1_234_567,
123_456_789,
12_345_678_901,
1_234_567_890_123,
999_999_999_999_999
]
for n in tests:
print(f"{n} -> {number_to_words(n)}")
if __name__ == "__main__":
main()
"""
run:
1234 -> one thousand two hundred and thirty four
12345 -> twelve thousand three hundred and forty five
123456 -> one hundred and twenty three thousand four hundred and fifty six
1234567 -> one million two hundred and thirty four thousand five hundred and sixty seven
123456789 -> one hundred and twenty three million four hundred and fifty six thousand seven hundred and eighty nine
12345678901 -> twelve billion three hundred and forty five million six hundred and seventy eight thousand nine hundred and one
1234567890123 -> one trillion two hundred and thirty four billion five hundred and sixty seven million eight hundred and ninety thousand one hundred and twenty three
999999999999999 -> nine hundred and ninety nine trillion nine hundred and ninety nine billion nine hundred and ninety nine million nine hundred and ninety nine thousand nine hundred and ninety nine
"""