# 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
``````

``````>>> 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.)
``````