175 lines
6.7 KiB
Python
175 lines
6.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
|
|
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
|
|
|
|
# This library is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU Lesser General Public
|
|
# License as published by the Free Software Foundation; either
|
|
# version 2.1 of the License, or (at your option) any later version.
|
|
# This library is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
# Lesser General Public License for more details.
|
|
# You should have received a copy of the GNU Lesser General Public
|
|
# License along with this library; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
# MA 02110-1301 USA
|
|
|
|
from __future__ import division, print_function, unicode_literals
|
|
|
|
from . import lang_EU
|
|
|
|
|
|
class Num2Word_RO(lang_EU.Num2Word_EU):
|
|
GIGA_SUFFIX = "iliard/e"
|
|
MEGA_SUFFIX = "ilion"
|
|
# inflection for mi/billion follows different rule
|
|
MEGA_SUFFIX_I = "ilioane"
|
|
GIGA_SUFFIX_I = "iliarde"
|
|
|
|
def setup(self):
|
|
super(Num2Word_RO, self).setup()
|
|
|
|
self.negword = "minus "
|
|
self.pointword = "virgulă"
|
|
self.exclude_title = ["și", "virgulă", "minus"]
|
|
self.errmsg_toobig = (
|
|
"Numărul e prea mare pentru a \
|
|
fi convertit în cuvinte (abs(%s) > %s)."
|
|
)
|
|
self.mid_numwords = [(1000, "mie/i"), (100, "sută/e"),
|
|
(90, "nouăzeci"), (80, "optzeci"),
|
|
(70, "șaptezeci"), (60, "șaizeci"),
|
|
(50, "cincizeci"), (40, "patruzeci"),
|
|
(30, "treizeci")]
|
|
self.low_numwords = ["douăzeci", "nouăsprezece", "optsprezece",
|
|
"șaptesprezece", "șaisprezece", "cincisprezece",
|
|
"paisprezece", "treisprezece", "doisprezece",
|
|
"unsprezece", "zece", "nouă", "opt", "șapte",
|
|
"șase", "cinci", "patru", "trei", "doi",
|
|
"unu", "zero"]
|
|
self.gen_numwords = ["", "o", "două", "trei", "patru", "cinci",
|
|
"șase", "șapte", "opt", "nouă"]
|
|
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_n,
|
|
1000000000: self.gen_numwords_n
|
|
}
|
|
self.ords = {"unu": "primul",
|
|
"doi": "al doilea",
|
|
"three": "al treilea",
|
|
"cinci": "al cincilea",
|
|
"opt": "al optulea",
|
|
"nouă": "al nouălea",
|
|
"doisprezece": "al doisprezecelea"}
|
|
|
|
def merge(self, lpair, rpair):
|
|
ltext, lnum = lpair
|
|
rtext, rnum = rpair
|
|
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, lnum)
|
|
lresult = (self.numwords_inflections[rnum][lnum], rtext_i)
|
|
return ("%s %s" % lresult, rnum)
|
|
elif 10 < lnum < 100:
|
|
if lnum % 10 == 0:
|
|
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:
|
|
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, lnum)
|
|
return ("%s %s" % (ltext, rtext_i), lnum * rnum)
|
|
|
|
def to_ordinal(self, value):
|
|
self.verify_ordinal(value)
|
|
if value == 1:
|
|
return "primul"
|
|
else:
|
|
value = self.to_cardinal(value)
|
|
return "al %slea" % (value)
|
|
|
|
def to_ordinal_num(self, value):
|
|
self.verify_ordinal(value)
|
|
if value == 1:
|
|
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("/")
|
|
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, 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(
|
|
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):
|
|
result = super(Num2Word_RO, self).to_year(
|
|
val,
|
|
longval=longval
|
|
)
|
|
# for years we want the era negation e.g. B.C., in our case
|
|
# it's î.Hr. or î.e.n
|
|
if result.startswith(self.negword):
|
|
result = result.replace(self.negword, "")
|
|
suffix = "î.Hr." if not suffix else suffix
|
|
if suffix:
|
|
result = "".join([
|
|
result,
|
|
" ",
|
|
suffix
|
|
])
|
|
return result
|