Improve lv (#132)

* Add legal form.

* Fix fractions (comma)

* Fix edge case, improve test coverage.

* Add most popular currencies

* PEP8 line length

* Fix some forms.
This commit is contained in:
Mārtiņš Šulcs
2017-11-01 19:04:09 +02:00
committed by Ernesto Rodriguez Ortiz
parent c326d59b2d
commit a1a3c53b39
2 changed files with 118 additions and 53 deletions

View File

@@ -101,66 +101,99 @@ from __future__ import unicode_literals
from .currency import parse_currency_parts from .currency import parse_currency_parts
ZERO = (u'nulle',) ZERO = ('nulle',)
ONES = { ONES = {
1: (u'viens',), 1: ('viens',),
2: (u'divi',), 2: ('divi',),
3: (u'trīs',), 3: ('trīs',),
4: (u'četri',), 4: ('četri',),
5: (u'pieci',), 5: ('pieci',),
6: (u'seši',), 6: ('seši',),
7: (u'septiņi',), 7: ('septiņi',),
8: (u'astoņi',), 8: ('astoņi',),
9: (u'deviņi',), 9: ('deviņi',),
} }
TENS = { TENS = {
0: (u'desmit',), 0: ('desmit',),
1: (u'vienpadsmit',), 1: ('vienpadsmit',),
2: (u'divpadsmit',), 2: ('divpadsmit',),
3: (u'trīspadsmit',), 3: ('trīspadsmit',),
4: (u'četrpadsmit',), 4: ('četrpadsmit',),
5: (u'piecpadsmit',), 5: ('piecpadsmit',),
6: (u'sešpadsmit',), 6: ('sešpadsmit',),
7: (u'septiņpadsmit',), 7: ('septiņpadsmit',),
8: (u'astoņpadsmit',), 8: ('astoņpadsmit',),
9: (u'deviņpadsmit',), 9: ('deviņpadsmit',),
} }
TWENTIES = { TWENTIES = {
2: (u'divdesmit',), 2: ('divdesmit',),
3: (u'trīsdesmit',), 3: ('trīsdesmit',),
4: (u'četrdesmit',), 4: ('četrdesmit',),
5: (u'piecdesmit',), 5: ('piecdesmit',),
6: (u'sešdesmit',), 6: ('sešdesmit',),
7: (u'septiņdesmit',), 7: ('septiņdesmit',),
8: (u'astoņdesmit',), 8: ('astoņdesmit',),
9: (u'deviņdesmit',), 9: ('deviņdesmit',),
} }
HUNDRED = (u'simts', u'simti', u'simtu') HUNDRED = ('simts', 'simti', 'simtu')
THOUSANDS = { THOUSANDS = {
1: (u'tūkstotis', u'tūkstoši', u'tūkstošu'), 1: ('tūkstotis', 'tūkstoši', 'tūkstošu'),
2: (u'miljons', u'miljoni', u'miljonu'), 2: ('miljons', 'miljoni', 'miljonu'),
3: (u'miljards', u'miljardi', u'miljardu'), 3: ('miljards', 'miljardi', 'miljardu'),
4: (u'triljons', u'triljoni', u'triljonu'), 4: ('triljons', 'triljoni', 'triljonu'),
5: (u'kvadriljons', u'kvadriljoni', u'kvadriljonu'), 5: ('kvadriljons', 'kvadriljoni', 'kvadriljonu'),
6: (u'kvintiljons', u'kvintiljoni', u'kvintiljonu'), 6: ('kvintiljons', 'kvintiljoni', 'kvintiljonu'),
7: (u'sikstiljons', u'sikstiljoni', u'sikstiljonu'), 7: ('sikstiljons', 'sikstiljoni', 'sikstiljonu'),
8: (u'septiljons', u'septiljoni', u'septiljonu'), 8: ('septiljons', 'septiljoni', 'septiljonu'),
9: (u'oktiljons', u'oktiljoni', u'oktiljonu'), 9: ('oktiljons', 'oktiljoni', 'oktiljonu'),
10: (u'nontiljons', u'nontiljoni', u'nontiljonu'), 10: ('nontiljons', 'nontiljoni', 'nontiljonu'),
} }
GENERIC_DOLLARS = ('dolārs', 'dolāri', 'dolāru')
GENERIC_CENTS = ('cents', 'centi', 'centu')
GENERIC_POUND = ('mārciņa', 'mārciņas', 'mārciņu')
GENERIC_PENCE = ('penss', 'pensi', 'pensu')
GENERIC_KRONA = ('krona', 'kronas', 'kronu')
GENERIC_ERA = ('ēre', 'ēras', 'ēru')
def prefix_currency(prefix, base):
return tuple("%s %s" % (prefix, i) for i in base)
"""
Sadly we have a legal form (used in legal and finance documents):
http://www.eiro.lv/files/upload/files/Eiro_rakstiba-1.pdf
https://likumi.lv/doc.php?id=254741
http://eur-lex.europa.eu/legal-content/LV/TXT/HTML/?uri=CELEX:31998R0974&from=LV
Source: http://publications.europa.eu/code/lv/lv-5000500.htm
"""
CURRENCIES = { CURRENCIES = {
'LVL': ( 'AUD': (prefix_currency('Austrālijas', GENERIC_DOLLARS), GENERIC_CENTS),
(u'lats', u'lati', u'latu'), (u'santīms', u'santīmi', u'santīmu') 'CAD': (prefix_currency('Kanādas', GENERIC_DOLLARS), GENERIC_CENTS),
), # repalced by EUR
'EUR': ( 'EEK': (prefix_currency('Igaunijas', GENERIC_KRONA), GENERIC_CENTS),
(u'eiro', u'eiro', u'eiro'), (u'cents', u'centi', u'centu') 'EUR': (('eiro', 'eiro', 'eiro'), GENERIC_CENTS),
), 'EUR_LEGAL': (('euro', 'euro', 'euro'), GENERIC_CENTS),
'GBP': (prefix_currency('sterliņu', GENERIC_POUND), GENERIC_PENCE),
# replaced by EUR
'LTL': ('lits', 'liti', 'litu', GENERIC_CENTS),
# replaced by EUR
'LVL': (('lats', 'lati', 'latu'), ('santīms', 'santīmi', 'santīmu')),
'USD': (prefix_currency('ASV', GENERIC_DOLLARS), GENERIC_CENTS),
'RUB': (prefix_currency('Krievijas', ('rublis', 'rubļi', 'rubļu')),
('kapeika', 'kapeikas', 'kapeiku')),
'SEK': (prefix_currency('Zviedrijas', GENERIC_KRONA), GENERIC_ERA),
'NOK': (prefix_currency('Norvēģijas', GENERIC_KRONA), GENERIC_ERA),
'PLN': (('zlots', 'zloti', 'zlotu'), ('grasis', 'graši', 'grašu')),
} }
@@ -181,11 +214,7 @@ def get_digits(n):
def pluralize(n, forms): def pluralize(n, forms):
# gettext implementation:
# (n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2)
form = 0 if (n % 10 == 1 and n % 100 != 11) else 1 if n != 0 else 2 form = 0 if (n % 10 == 1 and n % 100 != 11) else 1 if n != 0 else 2
return forms[form] return forms[form]
@@ -200,8 +229,6 @@ def int2word(n):
i -= 1 i -= 1
n1, n2, n3 = get_digits(x) n1, n2, n3 = get_digits(x)
# print str(n3) + str(n2) + str(n1)
if n3 > 0: if n3 > 0:
if n3 == 1 and n2 == 0 and n1 > 0: if n3 == 1 and n2 == 0 and n1 > 0:
words.append(HUNDRED[2]) words.append(HUNDRED[2])
@@ -219,7 +246,7 @@ def int2word(n):
elif n1 > 0 and not (i > 0 and x == 1): elif n1 > 0 and not (i > 0 and x == 1):
words.append(ONES[n1][0]) words.append(ONES[n1][0])
if i > 0: if i > 0 and x != 0:
words.append(pluralize(x, THOUSANDS[i])) words.append(pluralize(x, THOUSANDS[i]))
return ' '.join(words) return ' '.join(words)
@@ -229,7 +256,7 @@ def n2w(n):
n = str(n).replace(',', '.') n = str(n).replace(',', '.')
if '.' in n: if '.' in n:
left, right = n.split('.') left, right = n.split('.')
return u'%s kablelis %s' % (int2word(int(left)), int2word(int(right))) return u'%s komats %s' % (int2word(int(left)), int2word(int(right)))
else: else:
return int2word(int(n)) return int2word(int(n))

View File

@@ -7,9 +7,47 @@ from num2words import num2words
class Num2WordsLVTest(TestCase): class Num2WordsLVTest(TestCase):
def test_to_cardinal(self):
self.assertEqual(num2words(0, lang='lv'), 'nulle')
self.assertEqual(num2words(5, lang='lv'), "pieci")
self.assertEqual(num2words(15, lang='lv'), "piecpadsmit")
self.assertEqual(num2words(154, lang='lv'), "simts piecdesmit četri")
self.assertEqual(num2words(101, lang='lv'), "simtu viens")
self.assertEqual(
num2words(1135, lang='lv'), "tūkstotis simts trīsdesmit pieci"
)
self.assertEqual(
num2words(418531, lang='lv'),
"četri simti astoņpadsmit tūkstoši pieci simti trīsdesmit viens"
)
self.assertEqual(
num2words(1000139, lang='lv'),
"miljons simts trīsdesmit deviņi"
)
def test_to_currency(self): def test_to_currency(self):
self.assertEqual( self.assertEqual(
num2words('38.4', lang='lv', to='currency', seperator=' un', num2words('38.4', lang='lv', to='currency', seperator=' un',
cents=False, currency='EUR'), cents=False, currency='EUR'),
"trīsdesmit astoņi eiro un 40 centi" "trīsdesmit astoņi eiro un 40 centi"
) )
# EUR legal form
self.assertEqual(
num2words('38.4', lang='lv', to='currency', seperator=' un',
cents=False, currency='EUR_LEGAL'),
"trīsdesmit astoņi euro un 40 centi"
)
self.assertEqual(
num2words('38.4', lang='lv', to='currency', seperator=' un',
cents=False, currency='USD'),
"trīsdesmit astoņi ASV dolāri un 40 centi"
)
def test_fractions(self):
self.assertEqual(num2words(5.2, lang='lv'), "pieci komats divi")
self.assertEqual(
num2words(561.42, lang='lv'),
"pieci simti sešdesmit viens komats četrdesmit divi"
)