diff --git a/num2words/lang_RU.py b/num2words/lang_RU.py index 6461b35..0eed97a 100644 --- a/num2words/lang_RU.py +++ b/num2words/lang_RU.py @@ -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') diff --git a/tests/test_ru.py b/tests/test_ru.py index 879903c..2793c16 100644 --- a/tests/test_ru.py +++ b/tests/test_ru.py @@ -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(