Number to Word Converter (Python)

Updated vegaseat 3 Tallied Votes 11K Views Share

Sometimes when you get a large check from your employer, the value is written out in words. I get those all the time of course. So I wrote this little Python code to convert an integer value to english words. Numbers as high as 999 vigintillion can be used. In case you don't know, a vigintillion is 10 to the power 60. That is what our national deficit will be soon.

# integer number to english word conversion
# can be used for numbers as large as 999 vigintillion
# (vigintillion --> 10 to the power 60)
# tested with Python24      vegaseat      07dec2006

def int2word(n):
    """
    convert an integer number n into a string of english words
    """
    # break the number into groups of 3 digits using slicing
    # each group representing hundred, thousand, million, billion, ...
    n3 = []
    r1 = ""
    # create numeric string
    ns = str(n)
    for k in range(3, 33, 3):
        r = ns[-k:]
        q = len(ns) - k
        # break if end of ns has been reached
        if q < -2:
            break
        else:
            if  q >= 0:
                n3.append(int(r[:3]))
            elif q >= -1:
                n3.append(int(r[:2]))
            elif q >= -2:
                n3.append(int(r[:1]))
        r1 = r
    
    #print n3  # test
    
    # break each group of 3 digits into
    # ones, tens/twenties, hundreds
    # and form a string
    nw = ""
    for i, x in enumerate(n3):
        b1 = x % 10
        b2 = (x % 100)//10
        b3 = (x % 1000)//100
        #print b1, b2, b3  # test
        if x == 0:
            continue  # skip
        else:
            t = thousands[i]
        if b2 == 0:
            nw = ones[b1] + t + nw
        elif b2 == 1:
            nw = tens[b1] + t + nw
        elif b2 > 1:
            nw = twenties[b2] + ones[b1] + t + nw
        if b3 > 0:
            nw = ones[b3] + "hundred " + nw
    return nw

############# globals ################

ones = ["", "one ","two ","three ","four ", "five ",
    "six ","seven ","eight ","nine "]

tens = ["ten ","eleven ","twelve ","thirteen ", "fourteen ",
    "fifteen ","sixteen ","seventeen ","eighteen ","nineteen "]

twenties = ["","","twenty ","thirty ","forty ",
    "fifty ","sixty ","seventy ","eighty ","ninety "]

thousands = ["","thousand ","million ", "billion ", "trillion ",
    "quadrillion ", "quintillion ", "sextillion ", "septillion ","octillion ",
    "nonillion ", "decillion ", "undecillion ", "duodecillion ", "tredecillion ",
    "quattuordecillion ", "quindecillion", "sexdecillion ", "septendecillion ", 
	"octodecillion ", "novemdecillion ", "vigintillion "]

if __name__ == '__main__':
    # select an integer number n for testing or get it from user input
    #n = 4321234567890
    #n = 1111111111111
    #n = 1234567890123
    n = 1001000100100111
    #n = 1
    
    print n
        
    print "-"*50
    print int2word(n)
    print "-"*50

Dani AI

Generated

Nice thread and a classic problem. A few pitfalls to watch for when converting integers to English words at large scales: make sure your scale list is complete and in the correct order; omitting an entry (e.g., quindecillion) shifts everything above it. Also be explicit about the scale system you intend: the code here uses the short scale (10^9 billion), whereas some locales use the long scale (10^12 billion). If you need internationalization or academic correctness, document this or make it configurable; see Long and short scale. For output polish, consider hyphenating compound tens (twenty-one, ninety-nine) and optionally inserting British-style "and" (one hundred and one); conventions are summarized in English numerals. Edge cases to test: 0, negatives, group boundaries (999, 1_000, 1_001, 1_010, 1_100, 1_000_000), and very large values to ensure no off-by-one in scale indexing.

If this is for production or multilingual output, robust libraries save time and cover ordinals, currency, and plurals:

from num2words import num2words

num2words(1001000025)                  # cardinal
num2words(-42)                         # negatives
num2words(1234, to="ordinal")          # ordinal
num2words(1234.56, to="currency", currency="USD")  # checks

The num2words project is maintained and supports multiple locales and variants like en_GB (with "and"); see num2words on PyPI. For pluralization and additional English utilities, consider inflect.

wacawaca 0 Newbie Poster
units = ["", "one", "two", "three", "four",  "five", 
    "six", "seven", "eight", "nine "]

teens = ["", "eleven", "twelve", "thirteen",  "fourteen", 
    "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"]

tens = ["", "ten", "twenty", "thirty", "forty",
    "fifty", "sixty", "seventy", "eighty", "ninety"]

thousands = ["","thousand", "million",  "billion",  "trillion", 
    "quadrillion",  "quintillion",  "sextillion",  "septillion", "octillion", 
    "nonillion",  "decillion",  "undecillion",  "duodecillion",  "tredecillion", 
    "quattuordecillion",  "sexdecillion",  "septendecillion",  "octodecillion", 
    "novemdecillion",  "vigintillion "]


def numToWords(num):
    words = []
    if num == 0:
        words.append("zero")
    else:
        numStr = "%d" % num
        numStrLen = len(numStr)
        groups = (numStrLen + 2) / 3
        numStr = numStr.zfill(groups * 3)
        for i in range(0, groups*3, 3):
            h = int(numStr[i])
            t = int(numStr[i+1])
            u = int(numStr[i+2])
            g = groups - (i / 3 + 1)
            
            if h >= 1:
                words.append(units[h])
                words.append("hundred")
                
            if t > 1:
                words.append(tens[t])
                if u >= 1:
                    words.append(units[u])
            elif t == 1:
                if u >= 1:
                    words.append(teens[u])
                else:
                    words.append(tens[t])
            else:
                if u >= 1:
                    words.append(units[u])
            
            if g >= 1 and (h + t + u) > 0:
                words.append(thousands[g])

    return words

print numToWords(1000000000)
print " ".join(numToWords(1001000025))
print numToWords(0)
nickruiz 0 Newbie Poster

FYI, all of the other posts missed quindecillion, so any numbers above quattuordecillion are off.

scales = ["hundred", "thousand", "million", "billion", "trillion", 
"quadrillion",  "quintillion",  "sextillion",  "septillion", "octillion", 
"nonillion",  "decillion",  "undecillion",  "duodecillion",  "tredecillion", 
"quattuordecillion", "quindecillion", "sexdecillion",  "septendecillion",  "octodecillion", 
"novemdecillion",  "vigintillion"]
vegaseat 1,735 DaniWeb's Hypocrite Team Colleague

nickruiz, sharp eye, thank you!
I corrected it.

Abdullahi_2 0 Newbie Poster

Nice job it has been of great help to me to tackle my project. One love..

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.