From ab556a55937b4655ba444da8d069604e1ee37787 Mon Sep 17 00:00:00 2001 From: Adrian Branescu Date: Tue, 31 Jan 2023 14:04:29 +0200 Subject: [PATCH] Fix #498 - Romanian inflect is wrong for mega and giga values, add tests that replicated the issue and capture potential regressions, fix wrong tests --- num2words/lang_RO.py | 26 +++++++++++---- tests/test_ro.py | 76 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 92 insertions(+), 10 deletions(-) diff --git a/num2words/lang_RO.py b/num2words/lang_RO.py index ec1deda3..440bf9eb 100644 --- a/num2words/lang_RO.py +++ b/num2words/lang_RO.py @@ -21,7 +21,7 @@ class Num2Word_RO(lang_EU.Num2Word_EU): - GIGA_SUFFIX = "iliard/e" + GIGA_SUFFIX = "iliard" MEGA_SUFFIX = "ilion" # inflection for mi/billion follows different rule MEGA_SUFFIX_I = "ilioane" @@ -91,7 +91,10 @@ def merge(self, lpair, rpair): else: if rnum in self.numwords_inflections: rtext_i = self.inflect(lnum * rnum, rtext, lnum) - return ("%s %s" % (ltext, rtext_i), lnum * rnum) + if rnum in self.numwords_inflections: + return ("%s %s" % (ltext, rtext_i), lnum * rnum) + else: + return ("%s %s" % (ltext, rtext_i), lnum + rnum) def to_ordinal(self, value): self.verify_ordinal(value) @@ -126,11 +129,22 @@ def inflect(self, value, text, side_effect=-1): "de " + text[0][:-1] + text[1] ] result = self.pluralize(side_effect, forms) - # mega inflections are different + + # mega & giga inflections are different + replace_inflection = None 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) + replace_inflection = (self.MEGA_SUFFIX, self.MEGA_SUFFIX_I) + elif side_effect > 1 and result.endswith(self.GIGA_SUFFIX): + replace_inflection = (self.GIGA_SUFFIX, self.GIGA_SUFFIX_I) + + if replace_inflection is not None: + forms = [ + result, + result.replace(replace_inflection[0], replace_inflection[1]), + "de " + result.replace(replace_inflection[0], replace_inflection[1]) + ] + result = self.pluralize(side_effect, forms) + return result def to_currency(self, val, currency="RON", cents=False, separator=" și", diff --git a/tests/test_ro.py b/tests/test_ro.py index 4089ddd0..f64fad53 100644 --- a/tests/test_ro.py +++ b/tests/test_ro.py @@ -89,22 +89,90 @@ def test_cardinal_for_float_number(self): ) def test_big_numbers(self): + self.assertEqual( + num2words(12500, lang="ro"), + u"douăsprezece mii cinci sute" + ) + self.assertEqual( + num2words(21750, lang="ro"), + u"douăzeci și unu de mii șapte sute cincizeci" + ) self.assertEqual( num2words(1000000, lang="ro"), u"un milion" ) + self.assertEqual( + num2words(2000000, lang="ro"), + u"două milioane" + ) + self.assertEqual( + num2words(33000000, lang="ro"), + u"treizeci și trei de milioane" + ) self.assertEqual( num2words(1000000000, lang="ro"), u"un miliard" ) self.assertEqual( - num2words(33000000, lang="ro"), - u"treizeci și trei milioane" + num2words(2000000000, lang="ro"), + u"două miliarde" + ) + self.assertEqual( + num2words(12000000000, lang="ro"), + u"douăsprezece miliarde" + ) + self.assertEqual( + num2words(33000000000, lang="ro"), + u"treizeci și trei de miliarde" ) self.assertEqual( num2words(247000000000, lang="ro"), u"două sute patruzeci și șapte de miliarde" ) + self.assertEqual( + num2words(123456, lang="ro"), + u"o sută douăzeci și trei de mii patru sute cincizeci și șase" + ) + self.assertEqual( + num2words(1234567, lang="ro"), + u"un milion două sute treizeci și patru de mii cinci sute șaizeci" + u" și șapte" + ) + self.assertEqual( + num2words(9234567, lang="ro"), + u"nouă milioane două sute treizeci și patru de mii cinci sute" + u" șaizeci și șapte" + ) + self.assertEqual( + num2words(19234567, lang="ro"), + u"nouăsprezece milioane două sute treizeci și patru de mii cinci" + u" sute șaizeci și șapte" + ) + self.assertEqual( + num2words(319234567, lang="ro"), + u"trei sute nouăsprezece milioane două sute treizeci și patru de" + u" mii cinci sute șaizeci și șapte" + ) + self.assertEqual( + num2words(320234567, lang="ro"), + u"trei sute douăzeci de milioane două sute treizeci și patru de mii" + u" cinci sute șaizeci și șapte" + ) + self.assertEqual( + num2words(1319234567, lang="ro"), + u"un miliard trei sute nouăsprezece milioane două sute treizeci și" + u" patru de mii cinci sute șaizeci și șapte" + ) + self.assertEqual( + num2words(7319234567, lang="ro"), + u"șapte miliarde trei sute nouăsprezece milioane două sute treizeci" + u" și patru de mii cinci sute șaizeci și șapte" + ) + self.assertEqual( + num2words(27319234567, lang="ro"), + u"douăzeci și șapte de miliarde trei sute nouăsprezece milioane" + u" două sute treizeci și patru de mii cinci sute șaizeci și șapte" + ) def test_overflow(self): with self.assertRaises(OverflowError): @@ -154,7 +222,7 @@ def test_to_currency(self): u'optzeci de mii de lei') self.assertEqual( num2words(123456789, lang='ro', to='currency'), - u'una sută douăzeci și trei milioane patru sute ' + u'una sută douăzeci și trei de milioane patru sute ' u'cincizeci și șase de mii șapte sute optzeci și nouă de lei') def test_to_year(self): @@ -192,4 +260,4 @@ def test_to_year(self): self.assertEqual(num2words(1, lang='ro', to='year', suffix='d.Hr.'), u'unu d.Hr.') self.assertEqual(num2words(-66000000, lang='ro', to='year'), - u'șaizeci și șase milioane î.Hr.') + u'șaizeci și șase de milioane î.Hr.')