Code for this:
>>>def handel_upto_99(number):
predef={0:"zero",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:"fourty",50:"fifty",60:"sixty",70:"seventy",80:"eighty",90:"ninety",100:"hundred",100000:"lakh",10000000:"crore",1000000:"million",1000000000:"billion"}
if number in predef.keys():
return predef[number]
else:
return predef[(number/10)*10]+' '+predef[number%10]
>>>def return_bigdigit(number,devideby):
predef={0:"zero",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:"fourty",50:"fifty",60:"sixty",70:"seventy",80:"eighty",90:"ninety",100:"hundred",1000:"thousand",100000:"lakh",10000000:"crore",1000000:"million",1000000000:"billion"}
if devideby in predef.keys():
return predef[number/devideby]+" "+predef[devideby]
else:
devideby/=10
return handel_upto_99(number/devideby)+" "+predef[devideby]
>>>def mainfunction(number):
dev={100:"hundred",1000:"thousand",100000:"lakh",10000000:"crore",1000000000:"billion"}
if number is 0:
return "Zero"
if number<100:
result=handel_upto_99(number)
else:
result=""
while number>=100:
devideby=1
length=len(str(number))
for i in range(length-1):
devideby*=10
if number%devideby==0:
if devideby in dev:
return handel_upto_99(number/devideby)+" "+ dev[devideby]
else:
return handel_upto_99(number/(devideby/10))+" "+ dev[devideby/10]
res=return_bigdigit(number,devideby)
result=result+' '+res
if devideby not in dev:
number=number-((devideby/10)*(number/(devideby/10)))
number=number-devideby*(number/devideby)
if number <100:
result = result + ' '+ handel_upto_99(number)
return result
result:
>>>mainfunction(12345)
' twelve thousand three hundred fourty five'
>>>mainfunction(2000)
'two thousand'
Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article
num2words module in Python, which converts number (like 34) to words (like thirty-four). Also, this library has support for multiple languages. In this article, we will see how to convert number to words using num2words module. Installation One can easily install num2words using pip.
pip install num2words
Consider the following two excerpts from different files taken from 20 Newsgroups, a popular NLP database. Pre-processing 20 Newsgroups effectively has remained to be a matter of interest.
In article, Martin Preston writes: Why not use the PD C library for reading/writing TIFF files? It took me a good 20 minutes to start using them in your own app. ISCIS VIII is the eighth of a series of meetings which have brought together computer scientists and engineers from about twenty countries. This year’s conference will be held in the beautiful Mediterranean resort city of Antalya, in a region rich in natural as well as historical sites.
In the above two excerpts, one can observe that the number ’20’ appears in both numeric and alphabetical forms. Simply following the pre-processing steps, that involve tokenization, lemmatization and so on would not be able to map ’20’ and ‘twenty’ to the same stem, which is of contextual importance. Luckily, we have the in-built library, num2words which solves this problem in a single line. Below is the sample usage of the tool.
Python
from
num2words
import
num2words
print
(num2words(
36
))
print
(num2words(
36
, to
=
'ordinal'
))
print
(num2words(
36
, to
=
'ordinal_num'
))
print
(num2words(
36
, to
=
'year'
))
print
(num2words(
36
, to
=
'currency'
))
print
(num2words(
36
, lang
=
'es'
))
Output:
thirty-six thirty-sixth 36th zero euro, thirty-six cents treinta y seis
Time complexity: O(1).
Auxiliary space: O(1).
Therefore, in the pre-processing step, one could convert ALL numeric values to words for better accuracy in the further stages. References: https://pypi.org/project/num2words/
Like Article
Save Article
In this tutorial, we are going to learn how to convert a number to its wording (digit-wise). For instance, if the number is 12, the wordings will be “one-two”. A similar thing will be done for the rest of the inputs.
Code Implementation
We would be following a number of steps which are mentioned below:
Step 1: Creating a Global list for digit to word mapping
Create a global list containing wordings for each digit from 0 to 9. The list will contain elements mapped to the index as shown in the table below.
Index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Wording / Value | zero | one | two | three | four | five | six | seven | eight | nine |
# Global Array storing word for each digit arr = ['zero','one','two','three','four','five','six','seven','eight','nine']
Step 2: Taking the input of the number and creating the main function
To take input of the number we will make use of input
function and then typecast it to integer and also we will create an empty function that will convert our number to words digit-wise.
# Global Array storing word for each digit arr = ['zero','one','two','three','four','five','six','seven','eight','nine'] def number_2_word(n): pass n = int(input()) print("Number Entered was : ", n) print("Converted to word it becomes: ",end="") print(number_2_word(n))
Step 3: Coding the Main Logic Inside the Function
For this code, we will be making use of Recursion. If you have very little or no knowledge about Recursion I would recommend you to check out the tutorial mentioned below:
Read more on Recursion: Recursion in Python
For every recursive call, we will check if my number became 0, if it did we would return an empty string otherwise we will keep adding the wordings for each digit with the help of the modulus function and divide the number by 10 to shrink the number and move to the next digit.
The code implementation is shown below and comments are added for your understanding.
# Global Array storing word for each digit arr = ['zero','one','two','three','four','five','six','seven','eight','nine'] def number_2_word(n): # If all the digits are encountered return blank string if(n==0): return "" else: # compute spelling for the last digit small_ans = arr[n%10] # keep computing for the previous digits and add the spelling for the last digit ans = number_2_word(int(n/10)) + small_ans + " " # Return the final answer return ans n = int(input()) print("Number Entered was : ", n) print("Converted to word it becomes: ",end="") print(number_2_word(n))
Outputs:
Number Entered was : 123 Converted to word it becomes: one two three
Number Entered was : 46830 Converted to word it becomes: four six eight three zero
Conclusion
So by end of this tutorial, we saw that the numbers can easily be converted to the wording (digit-wise) in a pretty easy and simple way by the use of Recursion.
Thank you for reading! Happy Learning! 😇
Run
def convert_to_words(num): l = len(num) # Base cases if (l == 0): print("empty string") return if (l > 4): print("Length more than 4 is not supported") return single_digits = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"] two_digits = ["", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"] tens_multiple = ["", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"] tens_power = ["hundred", "thousand"] print(num, ":", end=" ") if (l == 1): print(single_digits[ord(num[0]) - 48]) return x = 0 while (x < len(num)): if (l >= 3): if (ord(num[x]) - 48 != 0): print(single_digits[ord(num[x]) - 48], end=" ") print(tens_power[l - 3], end=" ") l -= 1 else: if (ord(num[x]) - 48 == 1): sum = (ord(num[x]) - 48 + ord(num[x+1]) - 48) print(two_digits[sum]) return elif (ord(num[x]) - 48 == 2 and ord(num[x + 1]) - 48 == 0): print("twenty") return else: i = ord(num[x]) - 48 if(i > 0): print(tens_multiple[i], end=" ") else: print("", end="") x += 1 if(ord(num[x]) - 48 != 0): print(single_digits[ord(num[x]) - 48]) x += 1 # Driver Code convert_to_words("1121")
Example 1, we are going to convert a number to its wording. For instance, if the number is 12, the wordings will be “one-two”. A similar thing will be done for the rest of the inputs.
Example 1:
arr = ['zero','one','two','three','four','five','six','seven','eight','nine']
def number_2_word(n):
# If all the digits are encountered return blank string
if(n==0):
return ""
else:
# compute spelling for the last digit
small_ans = arr[n%10]
# keep computing for the previous digits and add the spelling for the last digit
ans = number_2_word(int(n/10)) + small_ans + " "
# Return the final answer
return ans
n = int(input())
print("Number Entered was : ", n)
print("In English: ",end="")
print(number_2_word(n))
Output:
Example 2: we are going to convert the number to its digital-place wise. For instance, if the number is 12, then the result will be twelve. Similar thing will be done for rest of the inputs.
Example 2:
Pre-defined Input
# convert a single-digit or two-digit number into words
def convertToDigit(n, suffix):
# if `n` is zero
if n == 0:
return EMPTY
# split `n` if it is more than 19
if n > 19:
return Y[n // 10] + X[n % 10] + suffix
else:
return X[n] + suffix
# convert a given number (max 9-digits) into words
def convert(n):
# add digits at ten million and hundred million place
result = convertToDigit((n // 1000000000) % 100, 'Billion, ')
# add digits at ten million and hundred million place
result += convertToDigit((n // 10000000) % 100, 'Crore, ')
# add digits at hundred thousand and one million place
result += convertToDigit(((n // 100000) % 100), 'Lakh, ')
# add digits at thousand and tens thousand place
result += convertToDigit(((n // 1000) % 100), 'Thousand, ')
# add digit at hundred place
result += convertToDigit(((n // 100) % 10), 'Hundred ')
if n > 100 and n % 100:
result += 'and '
# add digits at ones and tens place
result += convertToDigit((n % 100), '')
return result.strip().rstrip(',').replace(', and', ' and')
#convert numbers to words
if __name__ == '__main__':
EMPTY = ''
X = [EMPTY, 'One ', 'Two ', 'Three ', 'Four ', 'Five ', 'Six ', 'Seven ',
'Eight ', 'Nine ', 'Ten ', 'Eleven ', 'Twelve ', 'Thirteen ', 'Fourteen ',
'Fifteen ', 'Sixteen ', 'Seventeen ', 'Eighteen ', 'Nineteen ']
Y = [EMPTY, EMPTY, 'Twenty ', 'Thirty ', 'Forty ', 'Fifty ',
'Sixty ', 'Seventy ', 'Eighty ', 'Ninety ']
print(convert(0))
print(convert(7000))
print(convert(75432))
print(convert(997751076))
print(convert(6147493690))
Output:
The Tech Platform
www.thetechplatform.com
num2words library — Convert numbers to words in multiple languages
.. image:: https://img.shields.io/pypi/v/num2words.svg
:target: https://pypi.python.org/pypi/num2words
.. image:: https://travis-ci.org/savoirfairelinux/num2words.svg?branch=master
:target: https://travis-ci.org/savoirfairelinux/num2words
.. image:: https://coveralls.io/repos/github/savoirfairelinux/num2words/badge.svg?branch=master
:target: https://coveralls.io/github/savoirfairelinux/num2words?branch=master
num2words
is a library that converts numbers like 42
to words like forty-two
.
It supports multiple languages (see the list below for full list
of languages) and can even generate ordinal numbers like forty-second
(although this last feature is a bit buggy for some languages at the moment).
The project is hosted on GitHub_. Contributions are welcome.
.. _GitHub: https://github.com/savoirfairelinux/num2words
Installation
The easiest way to install num2words
is to use pip::
pip install num2words
Otherwise, you can download the source package and then execute::
python setup.py install
The test suite in this library is new, so it’s rather thin, but it can be run with::
python setup.py test
To run the full CI test suite which includes linting and multiple python environments::
pip install tox
tox
Usage
Command line::
$ num2words 10001
ten thousand and one
$ num2words 24,120.10
twenty-four thousand, one hundred and twenty point one
$ num2words 24,120.10 -l es
veinticuatro mil ciento veinte punto uno
$num2words 2.14 -l es --to currency
dos euros con catorce céntimos
In code there’s only one function to use::
>>> from num2words import num2words
>>> num2words(42)
forty-two
>>> num2words(42, to='ordinal')
forty-second
>>> num2words(42, lang='fr')
quarante-deux
Besides the numerical argument, there are two main optional arguments.
to: The converter to use. Supported values are:
cardinal
(default)ordinal
ordinal_num
year
currency
lang: The language in which to convert the number. Supported values are:
en
(English, default)am
(Amharic)ar
(Arabic)cz
(Czech)de
(German)dk
(Danish)en_GB
(English — Great Britain)en_IN
(English — India)es
(Spanish)es_CO
(Spanish — Colombia)es_VE
(Spanish — Venezuela)eu
(EURO)fa
(Farsi)fi
(Finnish)fr
(French)fr_CH
(French — Switzerland)fr_BE
(French — Belgium)fr_DZ
(French — Algeria)he
(Hebrew)hu
(Hungarian)id
(Indonesian)it
(Italian)ja
(Japanese)kn
(Kannada)ko
(Korean)kz
(Kazakh)lt
(Lithuanian)lv
(Latvian)no
(Norwegian)pl
(Polish)pt
(Portuguese)pt_BR
(Portuguese — Brazilian)sl
(Slovene)sr
(Serbian)sv
(Swedish)ro
(Romanian)ru
(Russian)te
(Telugu)tg
(Tajik)tr
(Turkish)th
(Thai)vi
(Vietnamese)nl
(Dutch)uk
(Ukrainian)
You can supply values like fr_FR
; if the country doesn’t exist but the
language does, the code will fall back to the base language (i.e. fr
). If
you supply an unsupported language, NotImplementedError
is raised.
Therefore, if you want to call num2words
with a fallback, you can do::
try:
return num2words(42, lang=mylang)
except NotImplementedError:
return num2words(42, lang='en')
Additionally, some converters and languages support other optional arguments
that are needed to make the converter useful in practice.
Wiki
For additional information on some localization please check the Wiki_.
And feel free to propose wiki enhancement.
.. _Wiki: https://github.com/savoirfairelinux/num2words/wiki
History
num2words
is based on an old library, pynum2word
, created by Taro Ogawa
in 2003. Unfortunately, the library stopped being maintained and the author
can’t be reached. There was another developer, Marius Grigaitis, who in 2011
added Lithuanian support, but didn’t take over maintenance of the project.
I am thus basing myself on Marius Grigaitis’ improvements and re-publishing
pynum2word
as num2words
.
Virgil Dupras, Savoir-faire Linux
Changelog
Version 0.5.12 — 2022/08/19
- Support Japanese Reiwa (令和/れいわ) era. (#412)
- Add basic farsi support (#354)
- Added Tajik language support (#406)
- Fix Amharic language support (#465)
- Fix Hebrew pluralize and implement to_currency (#330)
- Add support to translate some currencies in italian language (#434)
- Fix Polish twenties (#345)
- Add uzs for ru and en (#422)
- Added support for Esperanto numbers. (#387)
- [ADD] to ordinal number for Turkish (#468)
- Fix zeroth in Dutch to nulde fixing (#326)
Version 0.5.11 — 2022/08/03
- Add KZT and UAH currencies to lang RU (#264)
- Add es_NI currency (#276)
- Update .gitignore to add .eggs/ directory (#280)
- Fix Hebrew support (#289)
- Update test_tr.py to increase coverage (#298)
- Add ordinal 12,345 to ES test suite to increase coverage (#287)
- Add simple tests for lang_DK.py (#286)
- Add testcase for lang_EN.py (#288)
- Add more tests to base.py (#283)
- Fixed misspelling of 21 (cardinal and ordinal number) in IT language (#270)
- Romanian issues 259 (#260)
- Adding Language Support for Telugu / Bug Fix in Kannada (#263)
- Add support of Kazakh language (KZ) (#306)
- Update README.rst (#307)
- Added support for Hungarian language (#310)
- [UPD] Readme file (#363)
- [ADD] num2words: add traslation to spanish of several currencies (#356)
- added swedish language including test cases (#352)
- Remove dupplicated line in lang_PT_BR (#355)
- Fix ordinal_num output for Dutch (NL) (#369)
- Polishordinals (#367)
- [tr] return Turkish 0 ordinal and cardinal (#347)
- Improve Ukrainian support and minor fixes in CZ, KZ, LT, LV, PL, RU, SR languages (#400)
- feat: ci: replace travis by github workflows (#448)
- [ES] Added missing accents («dieciséis», «dólar», «dólares», «veintiún»), improved currency gender handling, fixed pound cent names (#443)
Version 0.5.10 — 2019/05/12
- Add Kannada language localization (#243)
- Revert some copyrights changed by mistake (#254)
- Add indian rupee to the supported currencies (#248)
- Improve currency functions for German and French (#247)
- Improve Slovene localization (#246)
- Improve Spanish localization (#240)
- Fix typo ‘seperator’ on source code (#238)
- Convert string to decimal values (#223)
- Improve German localization and test coverage (#237)
- Improve Polish localization (#233)
- Fix ordinal number for French ending on 1 (#236)
Version 0.5.9 — 2019/01/10
- Fix encoding issue on release 0.5.8 (#229)
- Improve Polish localization (#228)
Version 0.5.8 — 2018/11/17
- Add Portuguese (Portugal) localization (#198)
- Add a command line tool to use num2words
- Use language iso code for Vietnamese
- Improve Korean localization (#219)
- Improve Serbian (Latin) localization (#207)
- Improve testing setup (#220)
- Improve German localization (#214) (#222)
- Improve Romanian localization (#215)
- Improve Spanish localization (#187) (#200)
- Improve Russian localization (#211) (#212)
- Improve French localization (23902ab)
- Improve Arabic localization (#176)
- Improve Lithuanian and Latvian localization (#185)
- Improve Ukrainian localization (#183)
Version 0.5.7 — 2018/06/27
- Add Finnish localization. (#170)
- Add Japanese localization. (#171)
- Add belgian-french localization. (#151)
- Add Czech localization. (#154)
- Add Thai localization. (#139)
- Improve English localization. (#144)
- Improve Spanish localization. (#167)
- Improve Italian localization. (#143)
- Improve documentation. (#155, #145, #174)
Version 0.5.6 — 2017/11/22
- Refactor to_currency (#135)
- Allow the use of other convertes to_currency, to_year (#95)
- Fix code to respect PEP8 (#98, #105)
- Add Slovene localization (#97)
- Add Ukrainian localization (#93)
- Add Dutch localization (#91)
- Add Algeria-French localization (#86)
- Add Turkish localization (#85)
Version 0.5.5 — 2017/07/02
- Add Arabic localization (#72)
- Add Spanish-Colombian and Spanish-Venezuelan localization (#67)
- Add VietNam localization (#61)
- Add Italian localization (#56, #59)
- Improve Russian localization (#62)
- Improve Polish localization (#58)
Version 0.5.4 — 2016/10/18
- Tons of new languages!
- Add Polish localization. (#23)
- Add Swiss-French localization. (#38)
- Add Russian localization. (#28, #46, #48)
- Add Indonesian localization. (#29)
- Add Norwegian localization. (#33)
- Add Danish localization. (#40)
- Add Brazilian localization. (#37, #47)
- Improve German localization. (#25, #27, #49)
- Improve Lithuanian localization. (#52)
- Improve floating point spelling. (#24)
Version 0.5.3 — 2015/06/09
- Fix packaging issues. (#21, #22)
Version 0.5.2 — 2015/01/23
- Added Latvian localization. (#9)
- Improved Spanish localization. (#10, #13, #14)
- Improved Lithuanian localization. (#12)
Version 0.5.1 — 2014/03/14
- Added Python 3 support with 2to3. (#3)
- Fixed big numbers in spanish. (#2)
- Fixed bugs in tanslation from 30 to 40 in spanish. (#4)
- Fixed word joining in english. (#8)
Version 0.5.0 — 2013/05/28
- Created
num2words
based on the oldpynum2word
project.
num2words library — Convert numbers to words in multiple languages
num2words
is a library that converts numbers like 42
to words like forty-two
.
It supports multiple languages (see the list below for full list
of languages) and can even generate ordinal numbers like forty-second
(although this last feature is a bit buggy for some languages at the moment).
The project is hosted on GitHub. Contributions are welcome.
Installation
The easiest way to install num2words
is to use pip:
pip install num2words
Otherwise, you can download the source package and then execute:
python setup.py install
The test suite in this library is new, so it’s rather thin, but it can be run with:
python setup.py test
To run the full CI test suite which includes linting and multiple python environments:
pip install tox tox
Usage
Command line:
$ num2words 10001 ten thousand and one $ num2words 24,120.10 twenty-four thousand, one hundred and twenty point one $ num2words 24,120.10 -l es veinticuatro mil ciento veinte punto uno $num2words 2.14 -l es --to currency dos euros con catorce céntimos
In code there’s only one function to use:
>>> from num2words import num2words >>> num2words(42) forty-two >>> num2words(42, to='ordinal') forty-second >>> num2words(42, lang='fr') quarante-deux
Besides the numerical argument, there are two main optional arguments, to:
and lang:
to: The converter to use. Supported values are:
cardinal
(default)ordinal
ordinal_num
year
currency
lang: The language in which to convert the number. Supported values are:
en
(English, default)am
(Amharic)ar
(Arabic)az
(Azerbaijani)cz
(Czech)de
(German)dk
(Danish)en_GB
(English — Great Britain)en_IN
(English — India)en_NG
(English — Nigeria)es
(Spanish)es_CO
(Spanish — Colombia)es_VE
(Spanish — Venezuela)es_GT
(Spanish — Guatemala)eu
(EURO)fa
(Farsi)fi
(Finnish)fr
(French)fr_CH
(French — Switzerland)fr_BE
(French — Belgium)fr_DZ
(French — Algeria)he
(Hebrew)hu
(Hungarian)id
(Indonesian)is
(Icelandic)it
(Italian)ja
(Japanese)kn
(Kannada)ko
(Korean)kz
(Kazakh)lt
(Lithuanian)lv
(Latvian)no
(Norwegian)pl
(Polish)pt
(Portuguese)pt_BR
(Portuguese — Brazilian)sl
(Slovene)sr
(Serbian)sv
(Swedish)ro
(Romanian)ru
(Russian)te
(Telugu)tg
(Tajik)tr
(Turkish)th
(Thai)vi
(Vietnamese)nl
(Dutch)uk
(Ukrainian)
You can supply values like fr_FR
; if the country doesn’t exist but the
language does, the code will fall back to the base language (i.e. fr
). If
you supply an unsupported language, NotImplementedError
is raised.
Therefore, if you want to call num2words
with a fallback, you can do:
try: return num2words(42, lang=mylang) except NotImplementedError: return num2words(42, lang='en')
Additionally, some converters and languages support other optional arguments
that are needed to make the converter useful in practice.
Wiki
For additional information on some localization please check the Wiki.
And feel free to propose wiki enhancement.
History
num2words
is based on an old library, pynum2word
, created by Taro Ogawa
in 2003. Unfortunately, the library stopped being maintained and the author
can’t be reached. There was another developer, Marius Grigaitis, who in 2011
added Lithuanian support, but didn’t take over maintenance of the project.
I am thus basing myself on Marius Grigaitis’ improvements and re-publishing
pynum2word
as num2words
.
Virgil Dupras, Savoir-faire Linux