Implemented to_ordinal for RU (#212)

* Implemented to_ordinal for RU
This commit is contained in:
Vadim Smirnov
2018-10-14 01:57:48 +03:00
committed by Ernesto Rodriguez Ortiz
parent 411a92a4fe
commit af49bb360f
2 changed files with 128 additions and 4 deletions

View File

@@ -108,6 +108,27 @@ class Num2Word_RU(Num2Word_Base):
def setup(self):
self.negword = "минус"
self.pointword = "запятая"
self.ords = {"ноль": "нулевой",
"один": "первый",
"два": "второй",
"три": "третий",
"четыре": "четвертый",
"пять": "пятый",
"шесть": "шестой",
"семь": "седьмой",
"восемь": "восьмой",
"девять": "девятый",
"сто": "сотый"}
self.ords_feminine = {"один": "",
"одна": "",
"две": "двух",
"три": "трёх",
"четыре": "четырёх",
"пять": "пяти",
"шесть": "шести",
"семь": "семи",
"восемь": "восьми",
"девять": "девяти"}
def to_cardinal(self, number):
n = str(number).replace(',', '.')
@@ -134,7 +155,41 @@ class Num2Word_RU(Num2Word_Base):
return forms[form]
def to_ordinal(self, number):
raise NotImplementedError()
self.verify_ordinal(number)
outwords = self.to_cardinal(number).split(" ")
lastword = outwords[-1].lower()
try:
if len(outwords) > 1:
if outwords[-2] in self.ords_feminine:
outwords[-2] = self.ords_feminine.get(
outwords[-2], outwords[-2])
elif outwords[-2] == 'десять':
outwords[-2] = outwords[-2][:-1] + 'и'
if len(outwords) == 3:
if outwords[-3] in ['один', 'одна']:
outwords[-3] = ''
lastword = self.ords[lastword]
except KeyError:
if lastword[:-3] in self.ords_feminine:
lastword = self.ords_feminine.get(
lastword[:-3], lastword) + "сотый"
elif lastword[-1] == "ь" or lastword[-2] == "т":
lastword = lastword[:-1] + "ый"
elif lastword[-1] == "к":
lastword = lastword + "овой"
elif lastword[-5:] == "десят":
lastword = lastword.replace('ь', 'и') + 'ый'
elif lastword[-2] == "ч" or lastword[-1] == "ч":
if lastword[-2] == "ч":
lastword = lastword[:-1] + "ный"
if lastword[-1] == "ч":
lastword = lastword + "ный"
elif lastword[-1] == "н" or lastword[-2] == "н":
lastword = lastword[:lastword.rfind('н') + 1] + "ный"
elif lastword[-1] == "д" or lastword[-2] == "д":
lastword = lastword[:lastword.rfind('д') + 1] + "ный"
outwords[-1] = self.title(lastword)
return " ".join(outwords).strip()
def _cents_verbose(self, number, currency):
return self._int2word(number, currency == 'RUB')

View File

@@ -67,6 +67,9 @@ class Num2WordsRUTest(TestCase):
self.assertEqual(
num2words(1000139, lang='ru'), "один миллион сто тридцать девять"
)
self.assertEqual(num2words(-1, lang='ru'), "минус один")
self.assertEqual(num2words(-15, lang='ru'), "минус пятнадцать")
self.assertEqual(num2words(-100, lang='ru'), "минус сто")
def test_floating_point(self):
self.assertEqual(num2words(5.2, lang='ru'), "пять запятая два")
@@ -76,9 +79,75 @@ class Num2WordsRUTest(TestCase):
)
def test_to_ordinal(self):
# @TODO: implement to_ordinal
with self.assertRaises(NotImplementedError):
num2words(1, lang='ru', to='ordinal')
self.assertEqual(
num2words(1, lang='ru', to='ordinal'),
'первый'
)
self.assertEqual(
num2words(5, lang='ru', to='ordinal'),
'пятый'
)
self.assertEqual(
num2words(10, lang='ru', to='ordinal'),
'десятый'
)
self.assertEqual(
num2words(13, lang='ru', to='ordinal'),
'тринадцатый'
)
self.assertEqual(
num2words(20, lang='ru', to='ordinal'),
'двадцатый'
)
self.assertEqual(
num2words(23, lang='ru', to='ordinal'),
'двадцать третий'
)
self.assertEqual(
num2words(40, lang='ru', to='ordinal'),
'сороковой'
)
self.assertEqual(
num2words(70, lang='ru', to='ordinal'),
'семидесятый'
)
self.assertEqual(
num2words(100, lang='ru', to='ordinal'),
'сотый'
)
self.assertEqual(
num2words(136, lang='ru', to='ordinal'),
'сто тридцать шестой'
)
self.assertEqual(
num2words(500, lang='ru', to='ordinal'),
'пятисотый'
)
self.assertEqual(
num2words(1000, lang='ru', to='ordinal'),
'тысячный'
)
self.assertEqual(
num2words(1001, lang='ru', to='ordinal'),
'тысяча первый'
)
self.assertEqual(
num2words(2000, lang='ru', to='ordinal'),
'двух тысячный'
)
self.assertEqual(
num2words(10000, lang='ru', to='ordinal'),
'десяти тысячный'
)
self.assertEqual(
num2words(1000000, lang='ru', to='ordinal'),
'миллионный'
)
self.assertEqual(
num2words(1000000000, lang='ru', to='ordinal'),
'миллиардный'
)
def test_to_currency(self):
self.assertEqual(