How to convert numeric words into numeric in python

4.2k views Asked by At

I want to convert numeric which represented in words into numbers.

for example, thirty four thousand four fifty into its corresponding numerical value 34450. Also have some fuzzy conversions like "Please pay thirty-four thousand four fifty dollars" then the output to be 34450.

1

There are 1 answers

6
Oxymoron88 On BEST ANSWER

For numbers to words, try "num2words" package: https://pypi.python.org/pypi/num2words

For words to num, I tweaked the code slightly from the code here: Is there a way to convert number words to Integers?

from num2words import num2words

def text2int(textnum, numwords={}):
    if not numwords:
      units = [
        "zero", "one", "two", "three", "four", "five", "six", "seven", "eight",
        "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
        "sixteen", "seventeen", "eighteen", "nineteen",
      ]

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

      scales = ["hundred", "thousand", "million", "billion", "trillion"]

      numwords["and"] = (1, 0)
      for idx, word in enumerate(units):    numwords[word] = (1, idx)
      for idx, word in enumerate(tens):     numwords[word] = (1, idx * 10)
      for idx, word in enumerate(scales):   numwords[word] = (10 ** (idx * 3 or 2), 0)

    current = result = 0
    for word in textnum.split():
        if word not in numwords:
          raise Exception("Illegal word: " + word)

        scale, increment = numwords[word]
        current = current * scale + increment
        if scale > 100:
            result += current
            current = 0

    return result + current

#### My update to incorporate decimals
num = 5000222223.28
fullText = num2words(num).replace('-',' ').replace(',',' ')
print fullText

decimalSplit = fullText.split('point ')

if len(decimalSplit) > 1:
    decimalSplit2 = decimalSplit[1].split(' ')
    decPart = sum([float(text2int(decimalSplit2[x]))/(10)**(x+1) for x in range(len(decimalSplit2))])
else:
    decPart = 0

intPart = float(text2int(decimalSplit[0]))

Value = intPart + decPart

print Value

-> five billion two hundred and twenty two thousand two hundred and twenty three point two eight

-> 5000222223.28