Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Romanian issues 259 #260

Merged
merged 9 commits into from
Dec 31, 2019
40 changes: 27 additions & 13 deletions num2words/lang_RO.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,13 @@ def setup(self):
"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",
Expand All @@ -67,24 +67,29 @@ def setup(self):
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):
Expand All @@ -101,21 +106,30 @@ def to_ordinal_num(self, value):
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(
Expand Down
16 changes: 13 additions & 3 deletions tests/test_ro.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,20 +120,30 @@ def test_to_currency(self):
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'),
Expand Down