From 7639f5a8205f4af647c868c81913a9ef89ad0c68 Mon Sep 17 00:00:00 2001 From: SButko Date: Thu, 30 Aug 2018 11:12:05 +0300 Subject: [PATCH] [ADD] lang_LT: new currencies, feminine numerals - Adding feminine numeric forms. - Implementing new currency forms: USD, GBP, PLN, RUB (with feminine numeric forms). --- num2words/lang_LT.py | 40 +++++++++++++++++++--- tests/test_lt.py | 81 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 115 insertions(+), 6 deletions(-) diff --git a/num2words/lang_LT.py b/num2words/lang_LT.py index 5e2a2c2..4a1d8a9 100644 --- a/num2words/lang_LT.py +++ b/num2words/lang_LT.py @@ -22,6 +22,18 @@ from .utils import get_digits, splitbyx ZERO = ('nulis',) +ONES_FEMININE = { + 1: ('viena',), + 2: ('dvi',), + 3: ('trys',), + 4: ('keturios',), + 5: ('penkios',), + 6: ('šešios',), + 7: ('septynios',), + 8: ('aštuonios',), + 9: ('devynios',), +} + ONES = { 1: ('vienas',), 2: ('du',), @@ -73,11 +85,25 @@ THOUSANDS = { 10: ('naintilijonas', 'naintilijonai', 'naintilijonų'), } +GENERIC_CENTS = ('centas', 'centai', 'centų') + class Num2Word_LT(Num2Word_Base): CURRENCY_FORMS = { - 'LTL': (('litas', 'litai', 'litų'), ('centas', 'centai', 'centų')), - 'EUR': (('euras', 'eurai', 'eurų'), ('centas', 'centai', 'centų')), + 'LTL': (('litas', 'litai', 'litų'), GENERIC_CENTS), + 'EUR': (('euras', 'eurai', 'eurų'), GENERIC_CENTS), + 'USD': (('doleris', 'doleriai', 'dolerių'), GENERIC_CENTS), + 'GBP': ( + ('svaras sterlingų', 'svarai sterlingų', 'svarų sterlingų'), + ('pensas', 'pensai', 'pensų') + ), + 'PLN': ( + ('zlotas', 'zlotai', 'zlotų'), + ('grašis', 'grašiai', 'grašių')), + 'RUB': ( + ('rublis', 'rubliai', 'rublių'), + ('kapeika', 'kapeikos', 'kapeikų') + ), } def setup(self): @@ -114,7 +140,10 @@ class Num2Word_LT(Num2Word_Base): def to_ordinal(self, number): raise NotImplementedError() - def _int2word(self, n): + def _cents_verbose(self, number, currency): + return self._int2word(number, currency == 'RUB') + + def _int2word(self, n, feminine=False): if n == 0: return ZERO[0] @@ -139,7 +168,10 @@ class Num2Word_LT(Num2Word_Base): if n2 == 1: words.append(TENS[n1][0]) elif n1 > 0: - words.append(ONES[n1][0]) + if (i == 1 or feminine and i == 0) and n < 1000: + words.append(ONES_FEMININE[n1][0]) + else: + words.append(ONES[n1][0]) if i > 0: words.append(self.pluralize(x, THOUSANDS[i])) diff --git a/tests/test_lt.py b/tests/test_lt.py index 7515588..3424548 100644 --- a/tests/test_lt.py +++ b/tests/test_lt.py @@ -62,20 +62,27 @@ class Num2WordsLTTest(TestCase): num2words(1, lang='lt', to='ordinal') def test_to_currency(self): + # Test all available currency forms. + # LTL self.assertEqual( num2words(1.0, lang='lt', to='currency', currency='LTL'), 'vienas litas, nulis centų' ) + self.assertEqual( + num2words(10.01, lang='lt', to='currency', currency='LTL'), + 'dešimt litų, vienas centas' + ) self.assertEqual( num2words(1234.56, lang='lt', to='currency', currency='LTL'), 'vienas tūkstantis du šimtai trisdešimt keturi litai, ' 'penkiasdešimt šeši centai' ) + # EUR self.assertEqual( - num2words(-1251985, lang='lt', to='currency', currency='EUR', + num2words(-1251981, lang='lt', to='currency', currency='EUR', cents=False), 'minus dvylika tūkstančių penki šimtai devyniolika eurų, ' - '85 centai' + '81 centas' ) self.assertEqual( num2words(1.0, lang='lt', to='currency', currency='EUR'), @@ -86,3 +93,73 @@ class Num2WordsLTTest(TestCase): 'vienas tūkstantis du šimtai trisdešimt keturi eurai, ' 'penkiasdešimt šeši centai' ) + self.assertEqual( + num2words(1122.22, lang='lt', to='currency', currency='EUR'), + 'vienas tūkstantis vienas šimtas dvidešimt du eurai, ' + 'dvidešimt du centai' + ) + # USD + self.assertEqual( + num2words(-1281, lang='lt', to='currency', currency='USD', + cents=False), + 'minus dvylika dolerių, 81 centas' + ) + self.assertEqual( + num2words(1.0, lang='lt', to='currency', currency='USD'), + 'vienas doleris, nulis centų' + ) + self.assertEqual( + num2words(5.06, lang='lt', to='currency', currency='USD'), + 'penki doleriai, šeši centai' + ) + # GBP + self.assertEqual( + num2words(-1281, lang='lt', to='currency', currency='GBP', + cents=False), + 'minus dvylika svarų sterlingų, 81 pensas' + ) + self.assertEqual( + num2words(1.0, lang='lt', to='currency', currency='GBP'), + 'vienas svaras sterlingų, nulis pensų' + ) + self.assertEqual( + num2words(5.06, lang='lt', to='currency', currency='GBP'), + 'penki svarai sterlingų, šeši pensai' + ) + # PLN + self.assertEqual( + num2words(-1281, lang='lt', to='currency', currency='PLN', + cents=False), + 'minus dvylika zlotų, 81 grašis' + ) + self.assertEqual( + num2words(1.0, lang='lt', to='currency', currency='PLN'), + 'vienas zlotas, nulis grašių' + ) + self.assertEqual( + num2words(5.06, lang='lt', to='currency', currency='PLN'), + 'penki zlotai, šeši grašiai' + ) + # RUB + self.assertEqual( + num2words(-1281, lang='lt', to='currency', currency='RUB', + cents=False), + 'minus dvylika rublių, 81 kapeika' + ) + self.assertEqual( + num2words(1.0, lang='lt', to='currency', currency='RUB'), + 'vienas rublis, nulis kapeikų' + ) + self.assertEqual( + num2words(5.06, lang='lt', to='currency', currency='RUB'), + 'penki rubliai, šešios kapeikos' + ) + self.assertEqual( + num2words(-12.01, lang='lt', to='currency', currency='RUB'), + 'minus dvylika rublių, viena kapeika' + ) + self.assertEqual( + num2words(1122.22, lang='lt', to='currency', currency='RUB'), + 'vienas tūkstantis vienas šimtas dvidešimt du rubliai, ' + 'dvidešimt dvi kapeikos' + )