2013-05-28 11:34:53 -04:00
|
|
|
|
num2words - Convert numbers to words in multiple languages
|
|
|
|
|
|
==========================================================
|
|
|
|
|
|
|
2017-12-19 04:51:58 -08:00
|
|
|
|
.. image:: https://img.shields.io/pypi/v/num2words.svg
|
|
|
|
|
|
:target: https://pypi.python.org/pypi/num2words
|
|
|
|
|
|
|
2017-02-27 16:05:21 -05:00
|
|
|
|
.. image:: https://travis-ci.org/savoirfairelinux/num2words.svg?branch=master
|
|
|
|
|
|
:target: https://travis-ci.org/savoirfairelinux/num2words
|
2017-02-01 14:59:43 -05:00
|
|
|
|
|
2017-10-30 14:06:46 -04:00
|
|
|
|
.. image:: https://coveralls.io/repos/github/savoirfairelinux/num2words/badge.svg?branch=master
|
2017-10-30 14:08:44 -04:00
|
|
|
|
:target: https://coveralls.io/github/savoirfairelinux/num2words?branch=master
|
2017-10-30 14:06:46 -04:00
|
|
|
|
|
|
|
|
|
|
|
2017-10-22 18:06:49 +02:00
|
|
|
|
``num2words`` is a library that converts numbers like ``42`` to words like ``forty-two``.
|
2017-09-12 00:57:01 +02:00
|
|
|
|
It supports multiple languages (see the list below for full list
|
2017-09-07 09:39:20 +03:00
|
|
|
|
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).
|
2013-05-28 11:34:53 -04:00
|
|
|
|
|
2017-12-19 04:51:58 -08:00
|
|
|
|
The project is hosted on GitHub_. Contributions are welcome.
|
|
|
|
|
|
|
|
|
|
|
|
.. _GitHub: https://github.com/savoirfairelinux/num2words
|
2013-05-28 11:34:53 -04:00
|
|
|
|
|
2013-05-28 13:10:06 -04:00
|
|
|
|
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
|
|
|
|
|
|
|
2017-12-19 04:51:58 -08:00
|
|
|
|
The test suite in this library is new, so it's rather thin, but it can be run with::
|
2015-04-06 15:11:59 -04:00
|
|
|
|
|
|
|
|
|
|
python setup.py test
|
|
|
|
|
|
|
2013-05-28 11:34:53 -04:00
|
|
|
|
Usage
|
|
|
|
|
|
-----
|
|
|
|
|
|
|
|
|
|
|
|
There's only one function to use::
|
|
|
|
|
|
|
|
|
|
|
|
>>> from num2words import num2words
|
|
|
|
|
|
>>> num2words(42)
|
|
|
|
|
|
forty-two
|
2017-12-19 04:51:58 -08:00
|
|
|
|
>>> num2words(42, to='ordinal')
|
2013-05-28 11:34:53 -04:00
|
|
|
|
forty-second
|
|
|
|
|
|
>>> num2words(42, lang='fr')
|
|
|
|
|
|
quarante-deux
|
|
|
|
|
|
|
2018-06-15 18:14:56 +03:00
|
|
|
|
Besides the numerical argument, there are two main optional arguments.
|
2013-05-28 11:34:53 -04:00
|
|
|
|
|
2018-01-31 15:24:28 +01:00
|
|
|
|
**to:** The converter to use. Supported values are:
|
2017-11-06 20:19:26 -05:00
|
|
|
|
|
2017-10-30 14:06:46 -04:00
|
|
|
|
* ``cardinal`` (default)
|
|
|
|
|
|
* ``ordinal``
|
2017-11-06 20:19:26 -05:00
|
|
|
|
* ``ordinal_num``
|
2017-10-30 14:06:46 -04:00
|
|
|
|
* ``year``
|
|
|
|
|
|
* ``currency``
|
2013-05-28 11:34:53 -04:00
|
|
|
|
|
2014-06-02 12:48:23 -04:00
|
|
|
|
**lang:** The language in which to convert the number. Supported values are:
|
|
|
|
|
|
|
2017-09-07 09:39:20 +03:00
|
|
|
|
* ``en`` (English, default)
|
2017-06-21 22:22:27 +03:00
|
|
|
|
* ``ar`` (Arabic)
|
2018-02-19 22:30:20 +01:00
|
|
|
|
* ``cz`` (Czech)
|
2014-06-02 12:48:23 -04:00
|
|
|
|
* ``de`` (German)
|
2017-09-06 22:59:20 +02:00
|
|
|
|
* ``dk`` (Danish)
|
2017-09-07 09:39:20 +03:00
|
|
|
|
* ``en_GB`` (English - Great Britain)
|
|
|
|
|
|
* ``en_IN`` (English - India)
|
2014-06-02 12:48:23 -04:00
|
|
|
|
* ``es`` (Spanish)
|
2017-09-07 09:39:20 +03:00
|
|
|
|
* ``es_CO`` (Spanish - Colombia)
|
|
|
|
|
|
* ``es_VE`` (Spanish - Venezuela)
|
|
|
|
|
|
* ``eu`` (EURO)
|
2018-06-22 17:00:49 +03:00
|
|
|
|
* ``fi`` (Finnish)
|
2017-09-06 22:59:20 +02:00
|
|
|
|
* ``fr`` (French)
|
2017-09-07 09:39:20 +03:00
|
|
|
|
* ``fr_CH`` (French - Switzerland)
|
2018-01-16 20:38:43 +01:00
|
|
|
|
* ``fr_BE`` (French - Belgium)
|
2017-09-07 09:39:20 +03:00
|
|
|
|
* ``fr_DZ`` (French - Algeria)
|
2017-09-06 22:59:20 +02:00
|
|
|
|
* ``he`` (Hebrew)
|
2017-09-07 09:39:20 +03:00
|
|
|
|
* ``id`` (Indonesian)
|
2017-09-06 22:59:20 +02:00
|
|
|
|
* ``it`` (Italian)
|
2018-06-15 18:14:56 +03:00
|
|
|
|
* ``ja`` (Japanese)
|
2014-06-02 12:48:23 -04:00
|
|
|
|
* ``lt`` (Lithuanian)
|
|
|
|
|
|
* ``lv`` (Latvian)
|
2016-01-11 19:35:11 +01:00
|
|
|
|
* ``no`` (Norwegian)
|
2015-07-07 13:40:05 -04:00
|
|
|
|
* ``pl`` (Polish)
|
2017-12-19 04:51:58 -08:00
|
|
|
|
* ``pt_BR`` (Portuguese - Brazilian)
|
2017-10-22 18:06:49 +02:00
|
|
|
|
* ``sl`` (Slovene)
|
2017-09-06 22:59:20 +02:00
|
|
|
|
* ``ru`` (Russian)
|
2017-09-07 09:39:20 +03:00
|
|
|
|
* ``tr`` (Turkish)
|
2017-12-14 23:48:12 +07:00
|
|
|
|
* ``th`` (Thai)
|
2017-09-07 09:39:20 +03:00
|
|
|
|
* ``vn`` (Vietnamese)
|
2017-09-08 19:29:37 +02:00
|
|
|
|
* ``nl`` (Dutch)
|
2017-09-08 17:47:42 +03:00
|
|
|
|
* ``uk`` (Ukrainian)
|
2017-09-08 19:29:37 +02:00
|
|
|
|
|
2017-12-19 04:51:58 -08:00
|
|
|
|
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
|
2017-09-06 22:59:20 +02:00
|
|
|
|
you supply an unsupported language, ``NotImplementedError`` is raised.
|
2013-05-28 11:34:53 -04:00
|
|
|
|
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')
|
|
|
|
|
|
|
2018-06-15 18:14:56 +03:00
|
|
|
|
Additionally, some converters and languages support other optional arguments
|
|
|
|
|
|
that are needed to make the converter useful in practice.
|
|
|
|
|
|
|
2018-06-22 17:00:49 +03:00
|
|
|
|
**fi (Finnish)**
|
|
|
|
|
|
|
|
|
|
|
|
**case:** one of the following: nominative, genitive, partitive, inessive,
|
|
|
|
|
|
elative, illative, adessive, ablative, allative, essive, translative,
|
|
|
|
|
|
instructive, abessive, comitative. Defaults to nominative::
|
|
|
|
|
|
|
|
|
|
|
|
>>> num2words(42, lang='fi')
|
|
|
|
|
|
neljäkymmentäkaksi
|
|
|
|
|
|
>>> num2words(42, lang='fi', case='genitive')
|
|
|
|
|
|
neljänkymmenenkahden
|
|
|
|
|
|
>>> num2words(42, lang='fi', case='comitative')
|
|
|
|
|
|
neljinekymmeninekaksine
|
|
|
|
|
|
>>> num2words(42, lang='fi', to='ordinal', case='comitative')
|
|
|
|
|
|
neljänsinekymmenensinetoisine
|
|
|
|
|
|
|
|
|
|
|
|
**plural:** make the output words plural::
|
|
|
|
|
|
|
|
|
|
|
|
>>> num2words(42, lang='fi', plural=True)
|
|
|
|
|
|
neljätkymmenetkahdet
|
|
|
|
|
|
>>> num2words(42, lang='fi', case='essive', plural=True)
|
|
|
|
|
|
neljinäkymmeninäkaksina
|
|
|
|
|
|
>>> # same in plural
|
|
|
|
|
|
>>> num2words(42, lang='fi', case='comitative', plural=True)
|
|
|
|
|
|
neljinekymmeninekaksine
|
|
|
|
|
|
|
|
|
|
|
|
**prefer:** which case marker to use when there are multiple options::
|
|
|
|
|
|
|
|
|
|
|
|
>>> num2words(8, lang='fi', case="genitive", plural=True)
|
|
|
|
|
|
kahdeksien
|
|
|
|
|
|
>>> num2words(8, lang='fi', case="genitive", plural=True, prefer=["ain"])
|
|
|
|
|
|
kahdeksain
|
|
|
|
|
|
|
2018-06-15 18:14:56 +03:00
|
|
|
|
**ja (Japanese)**
|
|
|
|
|
|
|
|
|
|
|
|
**reading:** whether or not to return the reading of the converted number.
|
|
|
|
|
|
Also has the special value ``"arabic"`` when used with ``year``::
|
|
|
|
|
|
|
|
|
|
|
|
>>> num2words(42, lang='ja', reading=True)
|
|
|
|
|
|
よんじゅうに
|
|
|
|
|
|
>>> num2words(2017, lang='ja', to='year', reading='arabic')
|
|
|
|
|
|
平成29年
|
|
|
|
|
|
|
|
|
|
|
|
**prefer:** when there are multiple readings or (kanji) words available,
|
|
|
|
|
|
prefer those in the sequence ``prefer``::
|
|
|
|
|
|
|
|
|
|
|
|
>>> num2words(0, lang='ja')
|
|
|
|
|
|
零
|
|
|
|
|
|
>>> num2words(0, lang='ja', prefer=['〇'])
|
|
|
|
|
|
〇
|
|
|
|
|
|
>>> num2words(42, lang='ja', reading=True, prefer=['し'])
|
|
|
|
|
|
しじゅうに
|
|
|
|
|
|
>>> num2words(74, lang='ja', reading=True)
|
|
|
|
|
|
ななじゅうよん
|
|
|
|
|
|
>>> num2words(74, lang='ja', reading=True, prefer=['し', 'しち'])
|
|
|
|
|
|
しちじゅうし
|
|
|
|
|
|
>>> num2words(1375, lang='ja', to="year")
|
|
|
|
|
|
天授元年
|
|
|
|
|
|
>>> num2words(1375, lang='ja', to="year", prefer=['えいわ'])
|
|
|
|
|
|
永和元年
|
|
|
|
|
|
|
|
|
|
|
|
**era:** (``year`` only) whether or not to convert the year to the era
|
|
|
|
|
|
calendar format. Defaults to ``True``::
|
|
|
|
|
|
|
|
|
|
|
|
>>> num2words(2017, lang='ja', to='year', era=True)
|
|
|
|
|
|
平成二十九年
|
|
|
|
|
|
>>> num2words(2017, lang='ja', to='year', reading=True, era=True)
|
|
|
|
|
|
へいせいにじゅうくねん
|
|
|
|
|
|
>>> num2words(2017, lang='ja', to='year', era=False)
|
|
|
|
|
|
二千十七年
|
|
|
|
|
|
|
|
|
|
|
|
**counter:** (``ordinal`` and ``ordinal_num`` only) which counter to use with
|
|
|
|
|
|
the ordinal number. Defaults to ``番`` and only supports ``reading`` with
|
|
|
|
|
|
it::
|
|
|
|
|
|
|
|
|
|
|
|
>>> num2words(0, lang='ja', to='ordinal')
|
|
|
|
|
|
零番目
|
|
|
|
|
|
>>> num2words(1, lang='ja', to='ordinal', counter='人')
|
|
|
|
|
|
一人目
|
|
|
|
|
|
>>> num2words(1, lang='ja', to='ordinal', reading=True, counter='人')
|
|
|
|
|
|
NotImplementedError: Reading not implemented for 人
|
|
|
|
|
|
|
2013-05-28 11:34:53 -04:00
|
|
|
|
History
|
|
|
|
|
|
-------
|
|
|
|
|
|
|
2017-12-19 04:51:58 -08:00
|
|
|
|
``num2words`` is based on an old library, ``pynum2word``, created by Taro Ogawa
|
2017-09-06 22:59:20 +02:00
|
|
|
|
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.
|
2013-05-28 11:34:53 -04:00
|
|
|
|
|
2017-09-06 22:59:20 +02:00
|
|
|
|
I am thus basing myself on Marius Grigaitis' improvements and re-publishing
|
|
|
|
|
|
``pynum2word`` as ``num2words``.
|
2013-05-28 11:34:53 -04:00
|
|
|
|
|
|
|
|
|
|
Virgil Dupras, Savoir-faire Linux
|