From bdf651d1fa3b85da270a212229075c63cf6f25e0 Mon Sep 17 00:00:00 2001 From: Maria S Date: Sun, 9 Jun 2019 12:24:01 +0300 Subject: [PATCH 1/5] romanian-issues-259: rough implementation --- num2words/lang_RO.py | 40 +++++++++++++++++++++++++++------------- tests/test_ro.py | 9 +++++++++ 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/num2words/lang_RO.py b/num2words/lang_RO.py index d4693b8..d692626 100644 --- a/num2words/lang_RO.py +++ b/num2words/lang_RO.py @@ -48,13 +48,13 @@ class Num2Word_RO(lang_EU.Num2Word_EU): "unu", "zero"] self.gen_numwords = ["", "o", "două", "trei", "patru", "cinci", "șase", "șapte", "opt", "nouă"] - self.gen_numwords_m = ["", "un", "două", "trei", "patru", "cinci", + self.gen_numwords_n = ["", "un", "două", "trei", "patru", "cinci", "șase", "șapte", "opt", "nouă"] self.numwords_inflections = { 100: self.gen_numwords, 1000: self.gen_numwords, - 1000000: self.gen_numwords_m, - 1000000000: self.gen_numwords_m + 1000000: self.gen_numwords_n, + 1000000000: self.gen_numwords_n } self.ords = {"unu": "primul", "doi": "al doilea", @@ -67,24 +67,29 @@ class Num2Word_RO(lang_EU.Num2Word_EU): def merge(self, lpair, rpair): ltext, lnum = lpair rtext, rnum = rpair - rtext_i = self.inflect(rnum, rtext) - if lnum > 1 and rtext_i.endswith(self.MEGA_SUFFIX): - rtext_i = rtext_i.replace(self.MEGA_SUFFIX, self.MEGA_SUFFIX_I) + rtext_i = self.inflect(rnum, rtext, lnum) if 1 <= lnum < 10: if rnum not in self.numwords_inflections: return (rtext, rnum) else: - rtext_i = self.inflect(lnum * rnum, rtext) + rtext_i = self.inflect(lnum * rnum, rtext, lnum) lresult = (self.numwords_inflections[rnum][lnum], rtext_i) return ("%s %s" % lresult, rnum) elif 10 < lnum < 100: if lnum % 10 == 0: - return ("%s și %s" % (ltext, rtext), lnum + rnum) + if rnum in self.numwords_inflections: + rtext_i = self.inflect(lnum * rnum, rtext, lnum) + return ("%s %s" % (ltext, rtext_i), lnum * rnum) + else: + return ("%s și %s" % (ltext, rtext), lnum + rnum) else: - return ("%s %s" % (ltext, rtext_i), lnum * rnum) + rtext_i = self.inflect(lnum * rnum, rtext, lnum) + ltext_i = ltext if lnum % 10 != 2 \ + else ltext.replace("doi", "două") + return ("%s %s" % (ltext_i, rtext_i), lnum * rnum) else: if rnum in self.numwords_inflections: - rtext_i = self.inflect(lnum * rnum, rtext) + rtext_i = self.inflect(lnum * rnum, rtext, lnum) return ("%s %s" % (ltext, rtext_i), lnum * rnum) def to_ordinal(self, value): @@ -101,21 +106,30 @@ class Num2Word_RO(lang_EU.Num2Word_EU): return "1-ul" return "al %s-lea" % (value) - def inflect(self, value, text): + def inflect(self, value, text, side_effect=-1): text = text.split("/") if value in (1, 100, 1000, 100000, 1000000000): return text[0] if len(text) > 1 and text[0][-1] in "aăeiou": text[0] = text[0][:-1] - return "".join(text) + result = "".join(text) + # mega inflections are with 'oa' inside, use suffixes + if side_effect > 1 and result.endswith(self.MEGA_SUFFIX): + result = result.replace(self.MEGA_SUFFIX, self.MEGA_SUFFIX_I) + return result def to_currency(self, val, longval=True, old=False): cents = int(round(val*100)) + # romanian currency has a particularity for numeral: one + self.gen_numwords[1] = "una" result = self.to_splitnum(cents, hightxt="leu/i", lowtxt="ban/i", divisor=100, jointxt="și", longval=longval) + self.gen_numwords[1] = "o" # revert numeral return result.replace( "unu leu", "un leu" - ).replace("unu ban", "un ban") + ).replace( + "unu ban", "un ban" + ) def to_year(self, val, suffix=None, longval=True): result = super(Num2Word_RO, self).to_year( diff --git a/tests/test_ro.py b/tests/test_ro.py index b5e6c51..1681304 100644 --- a/tests/test_ro.py +++ b/tests/test_ro.py @@ -135,6 +135,15 @@ class Num2WordsROTest(TestCase): u'patru mii șapte sute șaptezeci și opt lei' u' și treizeci și doi bani') + self.assertEqual( + num2words(1200, lang='ro', to='currency'), + u'una mie două sute lei') + + + self.assertEqual( + num2words(22000, lang='ro', to='currency'), + u'douăzeci și două mii lei') + def test_to_year(self): self.assertEqual(num2words(1989, lang='ro', to='year'), u'o mie nouă sute optzeci și nouă') From a192afec85e5cc6dd2dc213f87fe431fcce96a6c Mon Sep 17 00:00:00 2001 From: Maria S Date: Sun, 9 Jun 2019 12:43:01 +0300 Subject: [PATCH 2/5] romanian-issues-259: test new branch --- tests/test_ro.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/test_ro.py b/tests/test_ro.py index 1681304..e0e5be7 100644 --- a/tests/test_ro.py +++ b/tests/test_ro.py @@ -120,29 +120,30 @@ class Num2WordsROTest(TestCase): num2words(38.4, lang='ro', to='currency'), u'treizeci și opt lei și patruzeci bani' ) - self.assertEqual( num2words(1.01, lang='ro', to='currency'), u'un leu și un ban' ) - self.assertEqual( num2words(4778.00, lang='ro', to='currency'), u'patru mii șapte sute șaptezeci și opt lei') - self.assertEqual( num2words(4778.32, lang='ro', to='currency'), u'patru mii șapte sute șaptezeci și opt lei' u' și treizeci și doi bani') - self.assertEqual( num2words(1200, lang='ro', to='currency'), u'una mie două sute lei') - - self.assertEqual( num2words(22000, lang='ro', to='currency'), u'douăzeci și două mii lei') + self.assertEqual( + num2words(80000, lang='ro', to='currency'), + u'optzeci mii lei') + self.assertEqual( + num2words(123456789, lang='ro', to='currency'), + u'una sută douăzeci și trei milioane patru sute ' + u'cincizeci și șase mii șapte sute optzeci și nouă lei') def test_to_year(self): self.assertEqual(num2words(1989, lang='ro', to='year'), From b362b7b347a5c2b162d1229410196c2d17ef0d59 Mon Sep 17 00:00:00 2001 From: mariaS210 Date: Thu, 7 Nov 2019 23:02:41 +0200 Subject: [PATCH 3/5] romanian-issues-259: implement and use pluralize --- num2words/lang_EU.py | 2 +- num2words/lang_RO.py | 44 +++++++++++++++++++++++++++++++++----------- tests/test_ro.py | 30 +++++++++++++++++++----------- 3 files changed, 53 insertions(+), 23 deletions(-) diff --git a/num2words/lang_EU.py b/num2words/lang_EU.py index 022d369..748f935 100644 --- a/num2words/lang_EU.py +++ b/num2words/lang_EU.py @@ -41,7 +41,7 @@ class Num2Word_EU(Num2Word_Base): 'NOK': (('krone', 'kroner'), ('øre', 'øre')), 'PLN': (('zloty', 'zlotys', 'zlotu'), ('grosz', 'groszy')), 'MXN': (('peso', 'pesos'), GENERIC_CENTS), - 'RON': (('leu', 'lei'), ('ban', 'bani')), + 'RON': (('leu', 'lei', 'de lei'), ('ban', 'bani', 'de bani')), 'INR': (('rupee', 'rupees'), ('paisa', 'paise')) } diff --git a/num2words/lang_RO.py b/num2words/lang_RO.py index d692626..31a3950 100644 --- a/num2words/lang_RO.py +++ b/num2words/lang_RO.py @@ -23,8 +23,9 @@ from . import lang_EU class Num2Word_RO(lang_EU.Num2Word_EU): GIGA_SUFFIX = "iliard/e" MEGA_SUFFIX = "ilion" - # inflection for million follows different rule + # inflection for mi/billion follows different rule MEGA_SUFFIX_I = "ilioane" + GIGA_SUFFIX_I = "iliarde" def setup(self): super(Num2Word_RO, self).setup() @@ -106,29 +107,50 @@ class Num2Word_RO(lang_EU.Num2Word_EU): return "1-ul" return "al %s-lea" % (value) + def pluralize(self, n, forms): + if n == 1: + form = 0 + elif n == 0 or (n % 100 > 0 and n % 100 < 20): + form = 1 + else: + form = 2 + return forms[form] + def inflect(self, value, text, side_effect=-1): text = text.split("/") - if value in (1, 100, 1000, 100000, 1000000000): - return text[0] - if len(text) > 1 and text[0][-1] in "aăeiou": - text[0] = text[0][:-1] - result = "".join(text) - # mega inflections are with 'oa' inside, use suffixes + result = text[0] + if len(text) > 1: + forms = [ + text[0], + text[0][:-1] + text[1], + "de " + text[0][:-1] + text[1] + ] + result = self.pluralize(side_effect, forms) + # mega inflections are different if side_effect > 1 and result.endswith(self.MEGA_SUFFIX): result = result.replace(self.MEGA_SUFFIX, self.MEGA_SUFFIX_I) + elif side_effect > 1 and result.endswith("iliare"): + result = result.replace("iliare", self.GIGA_SUFFIX_I) return result - def to_currency(self, val, longval=True, old=False): - cents = int(round(val*100)) + def to_currency(self, val, currency="RON", cents=False, separator=" și", adjective=False): # romanian currency has a particularity for numeral: one self.gen_numwords[1] = "una" - result = self.to_splitnum(cents, hightxt="leu/i", lowtxt="ban/i", - divisor=100, jointxt="și", longval=longval) + result = super(Num2Word_RO, self).to_currency( + int(round(val*100)), + currency, + True, + separator, + adjective + ) self.gen_numwords[1] = "o" # revert numeral return result.replace( "unu leu", "un leu" ).replace( "unu ban", "un ban" + ).replace( + # if the romanian low text is 0, it is not usually printed + separator + " zero bani", "" ) def to_year(self, val, suffix=None, longval=True): diff --git a/tests/test_ro.py b/tests/test_ro.py index e0e5be7..007316f 100644 --- a/tests/test_ro.py +++ b/tests/test_ro.py @@ -103,7 +103,7 @@ class Num2WordsROTest(TestCase): ) self.assertEqual( num2words(247000000000, lang="ro"), - u"două sute patruzeci și șapte miliarde" + u"două sute patruzeci și șapte de miliarde" ) def test_overflow(self): @@ -116,9 +116,17 @@ class Num2WordsROTest(TestCase): "0000000000000000000000000000000000000") def test_to_currency(self): + self.assertEqual( + num2words(1000, lang='ro', to='currency'), + u'una mie de lei' + ) + self.assertEqual( + num2words(101, lang='ro', to='currency'), + u'una sută unu lei' + ) self.assertEqual( num2words(38.4, lang='ro', to='currency'), - u'treizeci și opt lei și patruzeci bani' + u'treizeci și opt de lei și patruzeci de bani' ) self.assertEqual( num2words(1.01, lang='ro', to='currency'), @@ -126,24 +134,24 @@ class Num2WordsROTest(TestCase): ) self.assertEqual( num2words(4778.00, lang='ro', to='currency'), - u'patru mii șapte sute șaptezeci și opt lei') + u'patru mii șapte sute șaptezeci și opt de lei') self.assertEqual( num2words(4778.32, lang='ro', to='currency'), - u'patru mii șapte sute șaptezeci și opt lei' - u' și treizeci și doi bani') + u'patru mii șapte sute șaptezeci și opt de lei' + u' și treizeci și doi de bani') self.assertEqual( - num2words(1200, lang='ro', to='currency'), - u'una mie două sute lei') + num2words(1207, lang='ro', to='currency'), + u'una mie două sute șapte lei') self.assertEqual( num2words(22000, lang='ro', to='currency'), - u'douăzeci și două mii lei') + u'douăzeci și două de mii de lei') self.assertEqual( - num2words(80000, lang='ro', to='currency'), - u'optzeci mii lei') + num2words(13000, lang='ro', to='currency'), + u'treisprezece mii de lei') self.assertEqual( num2words(123456789, lang='ro', to='currency'), u'una sută douăzeci și trei milioane patru sute ' - u'cincizeci și șase mii șapte sute optzeci și nouă lei') + u'cincizeci și șase de mii șapte sute optzeci și nouă de lei') def test_to_year(self): self.assertEqual(num2words(1989, lang='ro', to='year'), From 09d5da35559c65c39f7103bb48d05bfde39c6e3d Mon Sep 17 00:00:00 2001 From: mariaS210 Date: Thu, 7 Nov 2019 23:08:16 +0200 Subject: [PATCH 4/5] romanian-issues-259: fix linter error --- num2words/lang_RO.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/num2words/lang_RO.py b/num2words/lang_RO.py index 31a3950..ec1deda 100644 --- a/num2words/lang_RO.py +++ b/num2words/lang_RO.py @@ -133,7 +133,8 @@ class Num2Word_RO(lang_EU.Num2Word_EU): result = result.replace("iliare", self.GIGA_SUFFIX_I) return result - def to_currency(self, val, currency="RON", cents=False, separator=" și", adjective=False): + def to_currency(self, val, currency="RON", cents=False, separator=" și", + adjective=False): # romanian currency has a particularity for numeral: one self.gen_numwords[1] = "una" result = super(Num2Word_RO, self).to_currency( From dc7f7907e55566684dec32c4a26608078092a2c0 Mon Sep 17 00:00:00 2001 From: mariaS210 Date: Thu, 7 Nov 2019 23:29:43 +0200 Subject: [PATCH 5/5] romanian-issues-259: revert a test --- tests/test_ro.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/test_ro.py b/tests/test_ro.py index 007316f..4089ddd 100644 --- a/tests/test_ro.py +++ b/tests/test_ro.py @@ -124,6 +124,10 @@ class Num2WordsROTest(TestCase): num2words(101, lang='ro', to='currency'), u'una sută unu lei' ) + self.assertEqual( + num2words(100, lang='ro', to='currency'), + u'una sută de lei' + ) self.assertEqual( num2words(38.4, lang='ro', to='currency'), u'treizeci și opt de lei și patruzeci de bani' @@ -146,8 +150,8 @@ class Num2WordsROTest(TestCase): num2words(22000, lang='ro', to='currency'), u'douăzeci și două de mii de lei') self.assertEqual( - num2words(13000, lang='ro', to='currency'), - u'treisprezece mii de lei') + num2words(80000, lang='ro', to='currency'), + u'optzeci de mii de lei') self.assertEqual( num2words(123456789, lang='ro', to='currency'), u'una sută douăzeci și trei milioane patru sute '