How to convert numbers from 0 to 999,999,999,999,999 (up to 999 trillion) into English words in Python

1 Answer

0 votes
"""
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

"""

 



answered Sep 5 by avibootz

Related questions

...