python – How to convert numbers to words without using num2word library?

python – How to convert numbers to words without using num2word library?

You can make this much simpler by using one dictionary and a try/except clause like this:

num2words = {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, 20: Twenty, 30: Thirty, 40: Forty, 
            50: Fifty, 60: Sixty, 70: Seventy, 80: Eighty, 
            90: Ninety, 0: Zero}

>>> def n2w(n):
        try:
            print num2words[n]
        except KeyError:
            try:
                print num2words[n-n%10] + num2words[n%10].lower()
            except KeyError:
                print Number out of range

>>> n2w(0)
Zero
>>> n2w(13)
Thirteen        
>>> n2w(91)
Ninetyone
>>> n2w(21)
Twentyone
>>> n2w(33)
Thirtythree

Are you allowed to use other packages? This one works really well for me:
Inflect. It is useful for natural language generation and has a method for turning numbers into english text.

I installed it with

$ pip install inflect

Then in your Python session

>>> import inflect
>>> p = inflect.engine()
>>> p.number_to_words(1234567)
one million, two hundred and thirty-four thousand, five hundred and sixty-seven

>>> p.number_to_words(22)
twenty-two

python – How to convert numbers to words without using num2word library?

Your first statement logic is incorrect. Unless Number is 1 or smaller, that statement is always True; 200 is greater than 1 as well.

Use and instead, and include 1 in the acceptable values:

if (Number >= 1) and (Number <= 19):

You could use chaining as well:

if 1 <= Number <= 19:

For numbers of 20 or larger, use divmod() to get both the number of tens and the remainder:

tens, remainder = divmod(Number, 10)

Demo:

>>> divmod(42, 10)
(4, 2)

then use those values to build your number from the parts:

return num2words2[tens - 2] + - + num2words1[below_ten]

Dont forget to account for cases when the number is above 20 and doesnt have a remainder from the divmod operation:

return num2words2[tens - 2] + - + num2words1[remainder] if remainder else num2words2[tens - 2]

All put together:

def number(Number):
    if 0 <= Number <= 19:
        return num2words1[Number]
    elif 20 <= Number <= 99:
        tens, remainder = divmod(Number, 10)
        return num2words2[tens - 2] + - + num2words1[remainder] if remainder else num2words2[tens - 2]
    else:
        print(Number out of implemented range of numbers.)

Leave a Reply

Your email address will not be published. Required fields are marked *