mirror of
https://github.com/bblaz/num2words.git
synced 2025-12-06 06:42:25 +00:00
committed by
Ernesto Rodriguez Ortiz
parent
411a92a4fe
commit
af49bb360f
@@ -108,6 +108,27 @@ class Num2Word_RU(Num2Word_Base):
|
|||||||
def setup(self):
|
def setup(self):
|
||||||
self.negword = "минус"
|
self.negword = "минус"
|
||||||
self.pointword = "запятая"
|
self.pointword = "запятая"
|
||||||
|
self.ords = {"ноль": "нулевой",
|
||||||
|
"один": "первый",
|
||||||
|
"два": "второй",
|
||||||
|
"три": "третий",
|
||||||
|
"четыре": "четвертый",
|
||||||
|
"пять": "пятый",
|
||||||
|
"шесть": "шестой",
|
||||||
|
"семь": "седьмой",
|
||||||
|
"восемь": "восьмой",
|
||||||
|
"девять": "девятый",
|
||||||
|
"сто": "сотый"}
|
||||||
|
self.ords_feminine = {"один": "",
|
||||||
|
"одна": "",
|
||||||
|
"две": "двух",
|
||||||
|
"три": "трёх",
|
||||||
|
"четыре": "четырёх",
|
||||||
|
"пять": "пяти",
|
||||||
|
"шесть": "шести",
|
||||||
|
"семь": "семи",
|
||||||
|
"восемь": "восьми",
|
||||||
|
"девять": "девяти"}
|
||||||
|
|
||||||
def to_cardinal(self, number):
|
def to_cardinal(self, number):
|
||||||
n = str(number).replace(',', '.')
|
n = str(number).replace(',', '.')
|
||||||
@@ -134,7 +155,41 @@ class Num2Word_RU(Num2Word_Base):
|
|||||||
return forms[form]
|
return forms[form]
|
||||||
|
|
||||||
def to_ordinal(self, number):
|
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):
|
def _cents_verbose(self, number, currency):
|
||||||
return self._int2word(number, currency == 'RUB')
|
return self._int2word(number, currency == 'RUB')
|
||||||
|
|||||||
@@ -67,6 +67,9 @@ class Num2WordsRUTest(TestCase):
|
|||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
num2words(1000139, lang='ru'), "один миллион сто тридцать девять"
|
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):
|
def test_floating_point(self):
|
||||||
self.assertEqual(num2words(5.2, lang='ru'), "пять запятая два")
|
self.assertEqual(num2words(5.2, lang='ru'), "пять запятая два")
|
||||||
@@ -76,9 +79,75 @@ class Num2WordsRUTest(TestCase):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def test_to_ordinal(self):
|
def test_to_ordinal(self):
|
||||||
# @TODO: implement to_ordinal
|
self.assertEqual(
|
||||||
with self.assertRaises(NotImplementedError):
|
num2words(1, lang='ru', to='ordinal'),
|
||||||
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):
|
def test_to_currency(self):
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
|
|||||||
Reference in New Issue
Block a user