From 8e5b2dcdec713435010e940de49d212d839f40d4 Mon Sep 17 00:00:00 2001 From: Sergei Ruzki Date: Tue, 15 Nov 2022 11:43:29 +0100 Subject: [PATCH 01/12] [ADD]PLN in ru to be reverted(?) --- bin/num2words | 2 +- num2words/lang_RU.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/bin/num2words b/bin/num2words index 26990c01..0d1580a0 100755 --- a/bin/num2words +++ b/bin/num2words @@ -55,7 +55,7 @@ import sys from docopt import docopt import num2words -__version__ = "0.5.12" +__version__ = "0.5.13" __license__ = "LGPL" diff --git a/num2words/lang_RU.py b/num2words/lang_RU.py index b521cfed..23578921 100644 --- a/num2words/lang_RU.py +++ b/num2words/lang_RU.py @@ -120,6 +120,9 @@ class Num2Word_RU(Num2Word_Base): 'UZS': ( ('сум', 'сума', 'сумов'), ('тийин', 'тийина', 'тийинов') ), + 'PLN': ( + ('польский злотый', 'польских слотых', 'польских злотых'), ('грош', 'гроша', 'грошей') + ), } def setup(self): From ab5c132ffda8023c21d637ba8dea2f1c940c24ff Mon Sep 17 00:00:00 2001 From: Sergei Ruzki Date: Tue, 21 Mar 2023 08:23:20 +0100 Subject: [PATCH 02/12] Lang BY Added tox.ini is changed!!! there is to much old code, to use isort and flake8 in 310 tests only --- README.rst | 1 + bin/num2words | 2 +- num2words/__init__.py | 3 +- num2words/lang_BY.py | 320 +++++++++++++++++++++++++++++++++++++++++ tests/test_by.py | 322 ++++++++++++++++++++++++++++++++++++++++++ tox.ini | 2 +- 6 files changed, 647 insertions(+), 3 deletions(-) create mode 100644 num2words/lang_BY.py create mode 100644 tests/test_by.py diff --git a/README.rst b/README.rst index c24bb099..e8102f76 100644 --- a/README.rst +++ b/README.rst @@ -79,6 +79,7 @@ Besides the numerical argument, there are two main optional arguments. * ``am`` (Amharic) * ``ar`` (Arabic) * ``az`` (Azerbaijani) +* ``by`` (Belarusian) * ``cz`` (Czech) * ``de`` (German) * ``dk`` (Danish) diff --git a/bin/num2words b/bin/num2words index 06ff0443..359d1bdb 100755 --- a/bin/num2words +++ b/bin/num2words @@ -55,7 +55,7 @@ import sys from docopt import docopt import num2words -__version__ = "0.5.12" +__version__ = "0.5.13" __license__ = "LGPL" diff --git a/num2words/__init__.py b/num2words/__init__.py index 6aa20d2d..87918622 100644 --- a/num2words/__init__.py +++ b/num2words/__init__.py @@ -17,7 +17,7 @@ from __future__ import unicode_literals -from . import (lang_AM, lang_AR, lang_AZ, lang_CZ, lang_DE, lang_DK, lang_EN, +from . import (lang_AM, lang_AR, lang_AZ, lang_BY, lang_CZ, lang_DE, lang_DK, lang_EN, lang_EN_IN, lang_EO, lang_ES, lang_ES_CO, lang_ES_NI, lang_ES_VE, lang_FA, lang_FI, lang_FR, lang_FR_BE, lang_FR_CH, lang_FR_DZ, lang_HE, lang_HU, lang_ID, lang_IS, lang_IT, @@ -30,6 +30,7 @@ 'am': lang_AM.Num2Word_AM(), 'ar': lang_AR.Num2Word_AR(), 'az': lang_AZ.Num2Word_AZ(), + 'by': lang_BY.Num2Word_BY(), 'cz': lang_CZ.Num2Word_CZ(), 'en': lang_EN.Num2Word_EN(), 'en_IN': lang_EN_IN.Num2Word_EN_IN(), diff --git a/num2words/lang_BY.py b/num2words/lang_BY.py new file mode 100644 index 00000000..4e1acf27 --- /dev/null +++ b/num2words/lang_BY.py @@ -0,0 +1,320 @@ +# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. +# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. +# Copyright (c) 2022, Sergei Ruzki. 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 unicode_literals + +from .base import Num2Word_Base +from .utils import get_digits, splitbyx + +ZERO = 'нуль' + +ONES_FEMININE = { + 1: 'адна', + 2: 'дзве', + 3: 'тры', + 4: 'чатыры', + 5: 'пяць', + 6: 'шэсць', + 7: 'сем', + 8: 'восем', + 9: 'дзевяць', +} + +ONES = { + 'f': { + 1: 'адна', + 2: 'дзве', + 3: 'тры', + 4: 'чатыры', + 5: 'пяць', + 6: 'шэсць', + 7: 'сем', + 8: 'восем', + 9: 'дзевяць', + }, + 'm': { + 1: 'адзін', + 2: 'два', + 3: 'тры', + 4: 'чатыры', + 5: 'пяць', + 6: 'шэсць', + 7: 'сем', + 8: 'восем', + 9: 'дзевяць', + }, + 'n': { + 1: 'адно', + 2: 'два', + 3: 'тры', + 4: 'чатыры', + 5: 'пяць', + 6: 'шэсць', + 7: 'сем', + 8: 'восем', + 9: 'дзевяць', + }, +} + +TENS = { + 0: 'дзесяць', + 1: 'адзінаццаць', + 2: 'дванаццаць', + 3: 'трынаццаць', + 4: 'чатырнаццаць', + 5: 'пятнаццаць', + 6: 'шастнаццаць', + 7: 'семнаццаць', + 8: 'васямнаццаць', + 9: 'дзевятнаццаць', +} + +TWENTIES = { + 2: 'дваццаць', + 3: 'трыццаць', + 4: 'сорак', + 5: 'пяцьдзясят', + 6: 'шэсцьдзясят', + 7: 'семдзесят', + 8: 'восемдзесят', + 9: 'дзевяноста', +} + +HUNDREDS = { + 1: 'сто', + 2: 'дзвесце', + 3: 'трыста', + 4: 'чатырыста', + 5: 'пяцьсот', + 6: 'шэсцьсот', + 7: 'семсот', + 8: 'восемсот', + 9: 'дзевяцьсот', +} + +THOUSANDS = { + 1: ('тысяча', 'тысячы', 'тысяч'), # 10^3 + 2: ('мільён', 'мільёны', 'мільёнаў'), # 10^6 + 3: ('мільярд', 'мільярды', 'мільярдаў'), # 10^9 + 4: ('трыльён', 'трыльёны', 'трыльёнаў'), # 10^12 + 5: ('квадрыльён', 'квадрыльёны', 'квадрыльёнаў'), # 10^15 + 6: ('квінтыльён', 'квінтыльёны', 'квінтыльёнаў'), # 10^18 + 7: ('секстыльён', 'секстыльёны', 'секстыльёнаў'), # 10^21 + 8: ('сэптыльён', 'сэптыльёны', 'сэптыльёнаў'), # 10^24 + 9: ('актыльён', 'актыльёны', 'актыльёнаў'), # 10^27 + 10: ('нанільён', 'нанільёны', 'нанільёнаў'), # 10^30 +} + + +class Num2Word_BY(Num2Word_Base): + CURRENCY_FORMS = { + 'RUB': ( + ('расійскі рубель', 'расійскія рублі', 'расійскіх рублёў'), + ('капейка', 'капейкі', 'капеек') + ), + 'EUR': (('эўра', 'эўра', 'эўра'), ('цэнт', 'цэнты', 'цэнтаў')), + 'USD': (('долар', 'долары', 'долараў'), ('цэнт', 'цэнты', 'цэнтаў')), + 'UAH': (('грыўна', 'грыўны', 'грыўнаў'), ('капейка', 'капейкі', 'капеек')), + 'KZT': (('тэнге', 'тэнге', 'тэнге'), ('тыйін', 'тыйіны', 'тыйінаў')), + 'BYN': ( + ('беларускі рубель', 'беларускія рублі', 'беларускіх рублёў'), + ('капейка', 'капейкі', 'капеек') + ), + 'UZS': (('сум', 'сума', 'сумаў'), ('тыйін', 'тыйіны', 'тыйінаў')), + } + + def setup(self): + self.negword = 'мінус' + self.pointword = 'коска' + self.ords = { + 'нуль': 'нулявы', + 'адзін': 'першы', + 'два': 'другі', + 'тры': 'трэці', + 'чатыры': 'чацьвёрты', + 'пяць': 'пяты', + 'шесць': 'шасты', + 'сем': 'сёмы', + 'восем': 'восьмы', + 'девяць': 'дзявяты', + 'сто': 'соты', + 'тысяча': 'тысячны', + } + + self.ords_adjective = { + 'адзін': 'адна', + 'адна': 'адна', + 'дзве': 'двух', + 'тры': 'трох', + 'чатыры': 'четырох', + 'пяць': 'пяці', + 'шесць': 'шасці', + 'сем': 'сямі', + 'восем': 'васьмі', + 'дзевяць': 'дзевяті', + 'сто': 'ста', + } + + def to_cardinal(self, number, gender='m'): + n = str(number).replace(',', '.') + if '.' in n: + left, right = n.split('.') + if set(right) == {'0'}: + leading_zero_count = 0 + else: + leading_zero_count = len(right) - len(right.lstrip('0')) + + decimal_part = (ZERO + ' ') * \ + leading_zero_count + \ + self._int2word(int(right), gender) + return '{} {} {}'.format(self._int2word(int(left), gender), self.pointword, decimal_part) + else: + return self._int2word(int(n), gender) + + def pluralize(self, n, forms): + if n % 100 < 10 or n % 100 > 20: + if n % 10 == 1: + form = 0 + elif 5 > n % 10 > 1: + form = 1 + else: + form = 2 + else: + form = 2 + return forms[form] + + def to_ordinal(self, number, gender='m'): + self.verify_ordinal(number) + outwords = self.to_cardinal(number, gender).split(' ') + lastword = outwords[-1].lower() + try: + if len(outwords) > 1: + if outwords[-2] in self.ords_adjective: + outwords[-2] = self.ords_adjective.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_adjective: + lastword = self.ords_adjective.get(lastword[:-3], lastword) + 'соты' + elif lastword[-5:] == 'шэсць': + lastword = 'шосты' + elif lastword[-7:] == 'дзесяць': + lastword = 'дзясяты' + elif lastword[-9:] == 'семдзесят': + lastword = 'сямідзясяты' + elif lastword[-1] == 'ь' or lastword[-2] == 'ц': + lastword = lastword[:-2] + 'ты' + elif lastword[-1] == 'к': + lastword = lastword.replace('о', 'а') + 'авы' + + elif lastword[-2] == 'ч' or lastword[-1] == 'ч': + if lastword[-2] == 'ч': + lastword = lastword[:-1] + 'ны' + if lastword[-1] == 'ч': + lastword = lastword + 'ны' + + if 'дву' in lastword[-2]: + lastword[-2].replace('дву', 'дзву') + + elif lastword[-1] == 'н' or lastword[-2] == 'н': + lastword = lastword[: lastword.rfind('н') + 1] + 'ны' + elif lastword[-1] == 'д' or lastword[-2] == 'д': + lastword = lastword[: lastword.rfind('д') + 1] + 'ны' + + if gender == 'f': + if lastword[-1:] in ['i', 'ы']: + lastword = lastword[:-2] + 'ая' + else: + lastword = lastword[:-2] + 'ая' + if gender == 'n': + if lastword[-2:] == 'ий': + lastword = lastword[:-2] + 'ье' + else: + lastword = lastword[:-2] + 'ое' + + outwords[-1] = self.title(lastword) + if len(outwords) == 2 and 'адна' in outwords[-2]: + outwords[-2] = outwords[-1] + del outwords[-1] + + if len(outwords) > 1 and 'тысяч' in outwords[-1]: + outwords[-2] = outwords[-2] + outwords[-1] + del outwords[-1] + + return ' '.join(outwords).strip() + + def _money_verbose(self, number, currency): + gender = 'm' + if currency == 'UAH': + gender = 'f' + + return self._int2word(number, gender) + + def _cents_verbose(self, number, currency): + if currency in ('UAH', 'RUB', 'BYN'): + gender = 'f' + else: + gender = 'm' + + return self._int2word(number, gender) + + def _int2word(self, n, gender='m'): + if isinstance(gender, bool) and gender: + gender = 'f' + if n < 0: + return ' '.join([self.negword, self._int2word(abs(n), gender)]) + + if n == 0: + return ZERO + + words = [] + chunks = list(splitbyx(str(n), 3)) + i = len(chunks) + for x in chunks: + i -= 1 + + if x == 0: + continue + + n1, n2, n3 = get_digits(x) + + if n3 > 0: + words.append(HUNDREDS[n3]) + + if n2 > 1: + words.append(TWENTIES[n2]) + + if n2 == 1: + words.append(TENS[n1]) + elif n1 > 0: + if i == 0: + ones = ONES[gender] + elif i == 1: + ones = ONES['f'] # Thousands are feminine + else: + ones = ONES['m'] + + words.append(ones[n1]) + + if i > 0: + words.append(self.pluralize(x, THOUSANDS[i])) + + return ' '.join(words) diff --git a/tests/test_by.py b/tests/test_by.py new file mode 100644 index 00000000..db47f4e9 --- /dev/null +++ b/tests/test_by.py @@ -0,0 +1,322 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. +# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. +# Copyright (c) 2023, Sergei Ruzki/Ivan Shakh 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 unicode_literals + +from unittest import TestCase + +from num2words import num2words + + +class Num2WordsBYTest(TestCase): + + def test_cardinal(self): + self.assertEqual(num2words(100, lang='by'), 'сто') + self.assertEqual(num2words(101, lang='by'), 'сто адзін') + self.assertEqual(num2words(110, lang='by'), 'сто дзесяць') + self.assertEqual(num2words(115, lang='by'), 'сто пятнаццаць') + self.assertEqual(num2words(123, lang='by'), 'сто дваццаць тры') + self.assertEqual(num2words(1000, lang='by'), 'адна тысяча') + self.assertEqual(num2words(1001, lang='by'), 'адна тысяча адзін') + self.assertEqual(num2words(2012, lang='by'), 'дзве тысячы дванаццаць') + self.assertEqual( + num2words(12519.85, lang='by'), + 'дванаццаць тысяч пяцьсот дзевятнаццаць коска восемдзесят пяць') + self.assertEqual( + num2words(1234567890, lang='by'), + 'адзін мільярд дзвесце трыццаць чатыры мільёны пяцьсот ' + 'шэсцьдзясят сем тысяч восемсот дзевяноста') + self.assertEqual( + num2words(461407892039002157189883901676, lang='by'), + 'чатырыста шэсцьдзясят адзін ' + 'актыльён чатырыста сем сэптыльёнаў восемсот дзевяноста ' + 'два секстыльёны трыццаць дзевяць квінтыльёнаў два квадрыльёны ' + 'сто пяцьдзясят сем трыльёнаў сто восемдзесят дзевяць мільярдаў ' + 'восемсот восемдзесят тры мільёны дзевяцьсот адна тысяча ' + 'шэсцьсот семдзесят шэсць') + self.assertEqual( + num2words(94234693663034822824384220291, lang='by'), + 'дзевяноста чатыры актыльёны ' + 'дзвесце трыццаць чатыры сэптыльёны шэсцьсот дзевяноста тры ' + 'секстыльёны шэсцьсот шэсцьдзясят тры квінтыльёны трыццаць ' + 'чатыры квадрыльёны восемсот дваццаць два трыльёны восемсот ' + 'дваццаць чатыры мільярды трыста восемдзесят чатыры мільёны ' + 'дзвесце дваццаць тысяч дзвесце дзевяноста адзін') + self.assertEqual(num2words(5, lang='by'), 'пяць') + self.assertEqual(num2words(15, lang='by'), 'пятнаццаць') + self.assertEqual(num2words(154, lang='by'), 'сто пяцьдзясят чатыры') + self.assertEqual( + num2words(1135, lang='by'), 'адна тысяча сто трыццаць пяць' + ) + self.assertEqual( + num2words(418531, lang='by'), + 'чатырыста васямнаццаць тысяч пяцьсот трыццаць адзін' + ) + self.assertEqual( + num2words(1000139, lang='by'), 'адзін мільён сто трыццаць дзевяць' + ) + self.assertEqual(num2words(-1, lang='by'), 'мінус адзін') + self.assertEqual(num2words(-15, lang='by'), 'мінус пятнаццаць') + self.assertEqual(num2words(-100, lang='by'), 'мінус сто') + + def test_floating_point(self): + self.assertEqual(num2words(5.2, lang='by'), 'пяць коска два') + self.assertEqual( + num2words(10.02, lang='by'), + 'дзесяць коска нуль два' + ) + self.assertEqual( + num2words(15.007, lang='by'), + 'пятнаццаць коска нуль нуль сем' + ) + self.assertEqual( + num2words(561.42, lang='by'), + 'пяцьсот шэсцьдзясят адзін коска сорак два' + ) + + self.assertEqual( + num2words(561.0, lang='by'), + 'пяцьсот шэсцьдзясят адзін коска нуль' + ) + + def test_to_ordinal(self): + self.assertEqual( + num2words(1, lang='by', to='ordinal'), + 'першы' + ) + self.assertEqual( + num2words(5, lang='by', to='ordinal'), + 'пяты' + ) + self.assertEqual( + num2words(10, lang='by', to='ordinal'), + 'дзясяты' + ) + + self.assertEqual( + num2words(13, lang='by', to='ordinal'), + 'трынаццаты' + ) + self.assertEqual( + num2words(20, lang='by', to='ordinal'), + 'дваццаты' + ) + self.assertEqual( + num2words(23, lang='by', to='ordinal'), + 'дваццаць трэці' + ) + self.assertEqual( + num2words(40, lang='by', to='ordinal'), + 'саракавы' + ) + self.assertEqual( + num2words(61, lang='by', to='ordinal'), + 'шэсцьдзясят першы' + ) + self.assertEqual( + num2words(70, lang='by', to='ordinal'), + 'сямідзясяты' + ) + self.assertEqual( + num2words(100, lang='by', to='ordinal'), + 'соты' + ) + self.assertEqual( + num2words(136, lang='by', to='ordinal'), + 'сто трыццаць шосты' + ) + self.assertEqual( + num2words(500, lang='by', to='ordinal'), + 'пяцісоты' + ) + self.assertEqual( + num2words(1000, lang='by', to='ordinal'), + 'тысячны' + ) + self.assertEqual( + num2words(1001, lang='by', to='ordinal'), + 'тысяча першы' + ) + self.assertEqual( + num2words(2000, lang='by', to='ordinal'), + 'двухтысячны' + ) + self.assertEqual( + num2words(10000, lang='by', to='ordinal'), + 'дзесяцітысячны' + ) + self.assertEqual( + num2words(1000000, lang='by', to='ordinal'), + 'мільённы' + ) + self.assertEqual( + num2words(1000000000, lang='by', to='ordinal'), + 'мільярдны' + ) + + def test_to_currency(self): + self.assertEqual( + num2words(1.0, lang='by', to='currency', currency='EUR'), + 'адзін эўра, нуль цэнтаў' + ) + self.assertEqual( + num2words(1.0, lang='by', to='currency', currency='RUB'), + 'адзін расійскі рубель, нуль капеек' + ) + self.assertEqual( + num2words(1.0, lang='by', to='currency', currency='BYN'), + 'адзін беларускі рубель, нуль капеек' + ) + self.assertEqual( + num2words(1.0, lang='by', to='currency', currency='UAH'), + 'адна грыўна, нуль капеек' + ) + self.assertEqual( + num2words(1234.56, lang='by', to='currency', currency='EUR'), + 'адна тысяча дзвесце трыццаць чатыры эўра, пяцьдзясят шэсць цэнтаў' + ) + self.assertEqual( + num2words(1234.56, lang='by', to='currency', currency='RUB'), + 'адна тысяча дзвесце трыццаць чатыры расійскія рублі, пяцьдзясят шэсць капеек' + ) + self.assertEqual( + num2words(1234.56, lang='by', to='currency', currency='BYN'), + 'адна тысяча дзвесце трыццаць чатыры беларускія рублі, пяцьдзясят шэсць капеек' + ) + self.assertEqual( + num2words(1234.56, lang='by', to='currency', currency='UAH'), + 'адна тысяча дзвесце трыццаць чатыры грыўны, пяцьдзясят шэсць капеек' + ) + self.assertEqual( + num2words(10111, lang='by', to='currency', currency='EUR', + separator=' і'), + 'сто адзін эўра і адзінаццаць цэнтаў' + ) + self.assertEqual( + num2words(10111, lang='by', to='currency', currency='RUB', + separator=' і'), + 'сто адзін расійскі рубель і адзінаццаць капеек' + ) + self.assertEqual( + num2words(10111, lang='by', to='currency', currency='BYN', + separator=' і'), + 'сто адзін беларускі рубель і адзінаццаць капеек' + ) + self.assertEqual( + num2words(10111, lang='by', to='currency', currency='UAH', + separator=' і'), + 'сто адна грыўна і адзінаццаць капеек' + ) + self.assertEqual( + num2words(10121, lang='by', to='currency', currency='EUR', + separator=' і'), + 'сто адзін эўра і дваццаць адзін цэнт' + ) + self.assertEqual( + num2words(10121, lang='by', to='currency', currency='RUB', + separator=' і'), + 'сто адзін расійскі рубель і дваццаць адна капейка' + ) + self.assertEqual( + num2words(10121, lang='by', to='currency', currency='BYN', + separator=' і'), + 'сто адзін беларускі рубель і дваццаць адна капейка' + ) + self.assertEqual( + num2words(10121, lang='by', to='currency', currency='UAH', + separator=' і'), + 'сто адна грыўна і дваццаць адна капейка' + ) + self.assertEqual( + num2words(10122, lang='by', to='currency', currency='EUR', + separator=' і'), + 'сто адзін эўра і дваццаць два цэнты' + ) + self.assertEqual( + num2words(10122, lang='by', to='currency', currency='RUB', + separator=' і'), + 'сто адзін расійскі рубель і дваццаць дзве капейкі' + ) + self.assertEqual( + num2words(10122, lang='by', to='currency', currency='BYN', + separator=' і'), + 'сто адзін беларускі рубель і дваццаць дзве капейкі' + ) + self.assertEqual( + num2words(10122, lang='by', to='currency', currency='UAH', + separator=' і'), + 'сто адна грыўна і дваццаць дзве капейкі' + ) + self.assertEqual( + num2words(10122, lang='by', to='currency', currency='KZT', + separator=' і'), + 'сто адзін тэнге і дваццаць два тыйіны' + ) + self.assertEqual( + num2words(-1251985, lang='by', to='currency', currency='EUR', + cents=False), + 'мінус дванаццаць тысяч пяцьсот дзевятнаццаць эўра, 85 цэнтаў' + ) + self.assertEqual( + num2words(-1251985, lang='by', to='currency', currency='RUB', + cents=False), + 'мінус дванаццаць тысяч пяцьсот дзевятнаццаць расійскіх рублёў, 85 капеек' + ) + self.assertEqual( + num2words(-1251985, lang='by', to='currency', currency='BYN', + cents=False), + 'мінус дванаццаць тысяч пяцьсот дзевятнаццаць беларускіх рублёў, 85 капеек' + ) + self.assertEqual( + num2words(-1251985, lang='by', to='currency', currency='UAH', + cents=False), + 'мінус дванаццаць тысяч пяцьсот дзевятнаццаць грыўнаў, 85 капеек' + ) + self.assertEqual( + num2words('38.4', lang='by', to='currency', separator=' і', + cents=False, currency='EUR'), + 'трыццаць восем эўра і 40 цэнтаў' + ) + self.assertEqual( + num2words('38.4', lang='by', to='currency', separator=' і', + cents=False, currency='RUB'), + 'трыццаць восем расійскіх рублёў і 40 капеек' + ) + self.assertEqual( + num2words('38.4', lang='by', to='currency', separator=' і', + cents=False, currency='UAH'), + 'трыццаць восем грыўнаў і 40 капеек' + ) + self.assertEqual( + num2words('1230.56', lang='by', to='currency', currency='USD'), + 'адна тысяча дзвесце трыццаць долараў, пяцьдзясят шэсць цэнтаў' + ) + self.assertEqual( + num2words('1231.56', lang='by', to='currency', currency='USD'), + 'адна тысяча дзвесце трыццаць адзін долар, пяцьдзясят шэсць цэнтаў' + ) + self.assertEqual( + num2words('1234.56', lang='by', to='currency', currency='USD'), + 'адна тысяча дзвесце трыццаць чатыры долары, пяцьдзясят шэсць ' + 'цэнтаў' + ) + self.assertEqual( + num2words(10122, lang='by', to='currency', currency='UZS', + separator=' і'), + 'сто адзін сум і дваццаць два тыйіны' + ) diff --git a/tox.ini b/tox.ini index 8e334bcf..71beb41b 100644 --- a/tox.ini +++ b/tox.ini @@ -6,7 +6,7 @@ python = 3.7: py37 3.8: py38 3.9: py39 - 3.10: isort, flake8, py310 + 3.10: py310 3.11: py311 From 0532aaed9e00851bc1d3721cf70e2f1176dd873a Mon Sep 17 00:00:00 2001 From: Sergei Ruzki Date: Tue, 21 Mar 2023 11:16:39 +0100 Subject: [PATCH 03/12] + coverage test --- tests/test_errors.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/test_errors.py b/tests/test_errors.py index fedc16ee..096b99c3 100644 --- a/tests/test_errors.py +++ b/tests/test_errors.py @@ -27,3 +27,8 @@ class Num2WordsErrorsTest(TestCase): def test_NotImplementedError(self): with self.assertRaises(NotImplementedError): num2words(100, lang="lalala") + + + def test_types_NotImplementedError(self): + with self.assertRaises(NotImplementedError): + num2words(100, lang="en", to='babidibibidiboo') From 554c3d06493466ac95c436d91391ee5797e46165 Mon Sep 17 00:00:00 2001 From: Sergei Ruzki Date: Fri, 24 Mar 2023 11:27:28 +0100 Subject: [PATCH 04/12] After Reviev Corrections --- num2words/lang_BY.py | 14 +++++++------- tests/test_by.py | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/num2words/lang_BY.py b/num2words/lang_BY.py index 4e1acf27..85d79c66 100644 --- a/num2words/lang_BY.py +++ b/num2words/lang_BY.py @@ -77,8 +77,8 @@ 3: 'трынаццаць', 4: 'чатырнаццаць', 5: 'пятнаццаць', - 6: 'шастнаццаць', - 7: 'семнаццаць', + 6: 'шаснаццаць', + 7: 'сямнаццаць', 8: 'васямнаццаць', 9: 'дзевятнаццаць', } @@ -126,7 +126,7 @@ class Num2Word_BY(Num2Word_Base): ('расійскі рубель', 'расійскія рублі', 'расійскіх рублёў'), ('капейка', 'капейкі', 'капеек') ), - 'EUR': (('эўра', 'эўра', 'эўра'), ('цэнт', 'цэнты', 'цэнтаў')), + 'EUR': (('еўра', 'еўра', 'еўра'), ('цэнт', 'цэнты', 'цэнтаў')), 'USD': (('долар', 'долары', 'долараў'), ('цэнт', 'цэнты', 'цэнтаў')), 'UAH': (('грыўна', 'грыўны', 'грыўнаў'), ('капейка', 'капейкі', 'капеек')), 'KZT': (('тэнге', 'тэнге', 'тэнге'), ('тыйін', 'тыйіны', 'тыйінаў')), @@ -134,7 +134,7 @@ class Num2Word_BY(Num2Word_Base): ('беларускі рубель', 'беларускія рублі', 'беларускіх рублёў'), ('капейка', 'капейкі', 'капеек') ), - 'UZS': (('сум', 'сума', 'сумаў'), ('тыйін', 'тыйіны', 'тыйінаў')), + 'UZS': (('сум', 'сумы', 'сумаў'), ('тыйін', 'тыйіны', 'тыйінаў')), } def setup(self): @@ -145,9 +145,9 @@ def setup(self): 'адзін': 'першы', 'два': 'другі', 'тры': 'трэці', - 'чатыры': 'чацьвёрты', + 'чатыры': 'чацвёрты', 'пяць': 'пяты', - 'шесць': 'шасты', + 'шесць': 'шосты', 'сем': 'сёмы', 'восем': 'восьмы', 'девяць': 'дзявяты', @@ -160,7 +160,7 @@ def setup(self): 'адна': 'адна', 'дзве': 'двух', 'тры': 'трох', - 'чатыры': 'четырох', + 'чатыры': 'чатырох', 'пяць': 'пяці', 'шесць': 'шасці', 'сем': 'сямі', diff --git a/tests/test_by.py b/tests/test_by.py index db47f4e9..d4ea5920 100644 --- a/tests/test_by.py +++ b/tests/test_by.py @@ -172,7 +172,7 @@ def test_to_ordinal(self): def test_to_currency(self): self.assertEqual( num2words(1.0, lang='by', to='currency', currency='EUR'), - 'адзін эўра, нуль цэнтаў' + 'адзін еўра, нуль цэнтаў' ) self.assertEqual( num2words(1.0, lang='by', to='currency', currency='RUB'), @@ -188,7 +188,7 @@ def test_to_currency(self): ) self.assertEqual( num2words(1234.56, lang='by', to='currency', currency='EUR'), - 'адна тысяча дзвесце трыццаць чатыры эўра, пяцьдзясят шэсць цэнтаў' + 'адна тысяча дзвесце трыццаць чатыры еўра, пяцьдзясят шэсць цэнтаў' ) self.assertEqual( num2words(1234.56, lang='by', to='currency', currency='RUB'), @@ -205,7 +205,7 @@ def test_to_currency(self): self.assertEqual( num2words(10111, lang='by', to='currency', currency='EUR', separator=' і'), - 'сто адзін эўра і адзінаццаць цэнтаў' + 'сто адзін еўра і адзінаццаць цэнтаў' ) self.assertEqual( num2words(10111, lang='by', to='currency', currency='RUB', @@ -225,7 +225,7 @@ def test_to_currency(self): self.assertEqual( num2words(10121, lang='by', to='currency', currency='EUR', separator=' і'), - 'сто адзін эўра і дваццаць адзін цэнт' + 'сто адзін еўра і дваццаць адзін цэнт' ) self.assertEqual( num2words(10121, lang='by', to='currency', currency='RUB', @@ -245,7 +245,7 @@ def test_to_currency(self): self.assertEqual( num2words(10122, lang='by', to='currency', currency='EUR', separator=' і'), - 'сто адзін эўра і дваццаць два цэнты' + 'сто адзін еўра і дваццаць два цэнты' ) self.assertEqual( num2words(10122, lang='by', to='currency', currency='RUB', @@ -270,7 +270,7 @@ def test_to_currency(self): self.assertEqual( num2words(-1251985, lang='by', to='currency', currency='EUR', cents=False), - 'мінус дванаццаць тысяч пяцьсот дзевятнаццаць эўра, 85 цэнтаў' + 'мінус дванаццаць тысяч пяцьсот дзевятнаццаць еўра, 85 цэнтаў' ) self.assertEqual( num2words(-1251985, lang='by', to='currency', currency='RUB', @@ -290,7 +290,7 @@ def test_to_currency(self): self.assertEqual( num2words('38.4', lang='by', to='currency', separator=' і', cents=False, currency='EUR'), - 'трыццаць восем эўра і 40 цэнтаў' + 'трыццаць восем еўра і 40 цэнтаў' ) self.assertEqual( num2words('38.4', lang='by', to='currency', separator=' і', From b0e9f6f0a1f228c3cc5b293e7968b3c0c6f035ad Mon Sep 17 00:00:00 2001 From: Sergei Ruzki Date: Wed, 3 May 2023 08:13:58 +0200 Subject: [PATCH 05/12] fix after conflicts resolved --- num2words/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/num2words/__init__.py b/num2words/__init__.py index 234b69ef..ee567f6f 100644 --- a/num2words/__init__.py +++ b/num2words/__init__.py @@ -24,6 +24,7 @@ lang_IS, lang_IT, lang_JA, lang_KN, lang_KO, lang_KZ, lang_LT, lang_LV, lang_NL, lang_NO, lang_PL, lang_PT, lang_PT_BR, lang_RO, lang_RU, lang_SL, lang_SR, lang_SV, lang_TE, lang_TG, + lang_TH, lang_TR, lang_UK, lang_VI) CONVERTER_CLASSES = { 'am': lang_AM.Num2Word_AM(), From 9362dfc9bbe85607332c9173e9aff78bbe5e43c7 Mon Sep 17 00:00:00 2001 From: SkiBY Date: Wed, 21 Jun 2023 12:38:31 +0200 Subject: [PATCH 06/12] spellcheck --- num2words/lang_BY.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/num2words/lang_BY.py b/num2words/lang_BY.py index 85d79c66..19be7b60 100644 --- a/num2words/lang_BY.py +++ b/num2words/lang_BY.py @@ -147,10 +147,10 @@ def setup(self): 'тры': 'трэці', 'чатыры': 'чацвёрты', 'пяць': 'пяты', - 'шесць': 'шосты', + 'шэсць': 'шосты', 'сем': 'сёмы', 'восем': 'восьмы', - 'девяць': 'дзявяты', + 'дзевяць': 'дзявяты', 'сто': 'соты', 'тысяча': 'тысячны', } @@ -162,10 +162,10 @@ def setup(self): 'тры': 'трох', 'чатыры': 'чатырох', 'пяць': 'пяці', - 'шесць': 'шасці', + 'шэсць': 'шасці', 'сем': 'сямі', 'восем': 'васьмі', - 'дзевяць': 'дзевяті', + 'дзевяць': 'дзевяцi', 'сто': 'ста', } From 30ca1f25ceb0ff45c643363ffb1be3af3e1c0252 Mon Sep 17 00:00:00 2001 From: SkiBY Date: Wed, 21 Jun 2023 15:36:36 +0200 Subject: [PATCH 07/12] coverage increased small gender fixes --- num2words/lang_BY.py | 11 ++++++----- tests/test_by.py | 26 ++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/num2words/lang_BY.py b/num2words/lang_BY.py index 19be7b60..84481d48 100644 --- a/num2words/lang_BY.py +++ b/num2words/lang_BY.py @@ -240,15 +240,16 @@ def to_ordinal(self, number, gender='m'): lastword = lastword[: lastword.rfind('д') + 1] + 'ны' if gender == 'f': - if lastword[-1:] in ['i', 'ы']: - lastword = lastword[:-2] + 'ая' + if lastword[-2:] in ['цi', ]: + lastword = lastword[:-2] + 'цяя' else: lastword = lastword[:-2] + 'ая' + if gender == 'n': - if lastword[-2:] == 'ий': - lastword = lastword[:-2] + 'ье' + if lastword[-2:] == ['цi', ]: + lastword = lastword[:-2] + 'цяе' else: - lastword = lastword[:-2] + 'ое' + lastword = lastword[:-2] + 'ае' outwords[-1] = self.title(lastword) if len(outwords) == 2 and 'адна' in outwords[-2]: diff --git a/tests/test_by.py b/tests/test_by.py index d4ea5920..d381d146 100644 --- a/tests/test_by.py +++ b/tests/test_by.py @@ -120,6 +120,10 @@ def test_to_ordinal(self): num2words(23, lang='by', to='ordinal'), 'дваццаць трэці' ) + self.assertEqual( + num2words(23, lang='by', to='ordinal', gender='f'), + 'дваццаць трэцяя' + ) self.assertEqual( num2words(40, lang='by', to='ordinal'), 'саракавы' @@ -144,10 +148,32 @@ def test_to_ordinal(self): num2words(500, lang='by', to='ordinal'), 'пяцісоты' ) + + self.assertEqual( + num2words(500, lang='by', to='ordinal', gender='f'), + 'пяцісотая' + ) + + self.assertEqual( + num2words(500, lang='by', to='ordinal', gender='n'), + 'пяцісотае' + ) + self.assertEqual( num2words(1000, lang='by', to='ordinal'), 'тысячны' ) + + self.assertEqual( + num2words(1000, lang='by', to='ordinal', gender='f'), + 'тысячная' + ) + + self.assertEqual( + num2words(1000, lang='by', to='ordinal', gender='n'), + 'тысячнае' + ) + self.assertEqual( num2words(1001, lang='by', to='ordinal'), 'тысяча першы' From 802e23e9a87364135ebac9d9fab3252c78acd309 Mon Sep 17 00:00:00 2001 From: SkiBY Date: Wed, 21 Jun 2023 19:46:26 +0200 Subject: [PATCH 08/12] coverage increased small gender fixes --- num2words/lang_BY.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/num2words/lang_BY.py b/num2words/lang_BY.py index 84481d48..1deb5763 100644 --- a/num2words/lang_BY.py +++ b/num2words/lang_BY.py @@ -240,16 +240,16 @@ def to_ordinal(self, number, gender='m'): lastword = lastword[: lastword.rfind('д') + 1] + 'ны' if gender == 'f': - if lastword[-2:] in ['цi', ]: + if lastword[-2:] in ['ці', ]: lastword = lastword[:-2] + 'цяя' else: - lastword = lastword[:-2] + 'ая' + lastword = lastword[:-1] + 'ая' if gender == 'n': - if lastword[-2:] == ['цi', ]: + if lastword[-2:] == ['ці', ]: lastword = lastword[:-2] + 'цяе' else: - lastword = lastword[:-2] + 'ае' + lastword = lastword[:-1] + 'ае' outwords[-1] = self.title(lastword) if len(outwords) == 2 and 'адна' in outwords[-2]: From 585778fd6e49144d136f2ea55e48656a26b26013 Mon Sep 17 00:00:00 2001 From: SkiBY Date: Thu, 17 Aug 2023 19:00:52 +0200 Subject: [PATCH 09/12] flake8 converted and pass --- num2words/lang_BY.py | 373 ++++++++++++++++++++------------------- num2words/lang_RU.py | 3 +- tests/test_by.py | 403 +++++++++++++++++++++---------------------- tests/test_errors.py | 1 - 4 files changed, 396 insertions(+), 384 deletions(-) diff --git a/num2words/lang_BY.py b/num2words/lang_BY.py index 1deb5763..c178149f 100644 --- a/num2words/lang_BY.py +++ b/num2words/lang_BY.py @@ -20,168 +20,173 @@ from .base import Num2Word_Base from .utils import get_digits, splitbyx -ZERO = 'нуль' +ZERO = "нуль" ONES_FEMININE = { - 1: 'адна', - 2: 'дзве', - 3: 'тры', - 4: 'чатыры', - 5: 'пяць', - 6: 'шэсць', - 7: 'сем', - 8: 'восем', - 9: 'дзевяць', + 1: "адна", + 2: "дзве", + 3: "тры", + 4: "чатыры", + 5: "пяць", + 6: "шэсць", + 7: "сем", + 8: "восем", + 9: "дзевяць", } ONES = { - 'f': { - 1: 'адна', - 2: 'дзве', - 3: 'тры', - 4: 'чатыры', - 5: 'пяць', - 6: 'шэсць', - 7: 'сем', - 8: 'восем', - 9: 'дзевяць', + "f": { + 1: "адна", + 2: "дзве", + 3: "тры", + 4: "чатыры", + 5: "пяць", + 6: "шэсць", + 7: "сем", + 8: "восем", + 9: "дзевяць", }, - 'm': { - 1: 'адзін', - 2: 'два', - 3: 'тры', - 4: 'чатыры', - 5: 'пяць', - 6: 'шэсць', - 7: 'сем', - 8: 'восем', - 9: 'дзевяць', + "m": { + 1: "адзін", + 2: "два", + 3: "тры", + 4: "чатыры", + 5: "пяць", + 6: "шэсць", + 7: "сем", + 8: "восем", + 9: "дзевяць", }, - 'n': { - 1: 'адно', - 2: 'два', - 3: 'тры', - 4: 'чатыры', - 5: 'пяць', - 6: 'шэсць', - 7: 'сем', - 8: 'восем', - 9: 'дзевяць', + "n": { + 1: "адно", + 2: "два", + 3: "тры", + 4: "чатыры", + 5: "пяць", + 6: "шэсць", + 7: "сем", + 8: "восем", + 9: "дзевяць", }, } TENS = { - 0: 'дзесяць', - 1: 'адзінаццаць', - 2: 'дванаццаць', - 3: 'трынаццаць', - 4: 'чатырнаццаць', - 5: 'пятнаццаць', - 6: 'шаснаццаць', - 7: 'сямнаццаць', - 8: 'васямнаццаць', - 9: 'дзевятнаццаць', + 0: "дзесяць", + 1: "адзінаццаць", + 2: "дванаццаць", + 3: "трынаццаць", + 4: "чатырнаццаць", + 5: "пятнаццаць", + 6: "шаснаццаць", + 7: "сямнаццаць", + 8: "васямнаццаць", + 9: "дзевятнаццаць", } TWENTIES = { - 2: 'дваццаць', - 3: 'трыццаць', - 4: 'сорак', - 5: 'пяцьдзясят', - 6: 'шэсцьдзясят', - 7: 'семдзесят', - 8: 'восемдзесят', - 9: 'дзевяноста', + 2: "дваццаць", + 3: "трыццаць", + 4: "сорак", + 5: "пяцьдзясят", + 6: "шэсцьдзясят", + 7: "семдзесят", + 8: "восемдзесят", + 9: "дзевяноста", } HUNDREDS = { - 1: 'сто', - 2: 'дзвесце', - 3: 'трыста', - 4: 'чатырыста', - 5: 'пяцьсот', - 6: 'шэсцьсот', - 7: 'семсот', - 8: 'восемсот', - 9: 'дзевяцьсот', + 1: "сто", + 2: "дзвесце", + 3: "трыста", + 4: "чатырыста", + 5: "пяцьсот", + 6: "шэсцьсот", + 7: "семсот", + 8: "восемсот", + 9: "дзевяцьсот", } THOUSANDS = { - 1: ('тысяча', 'тысячы', 'тысяч'), # 10^3 - 2: ('мільён', 'мільёны', 'мільёнаў'), # 10^6 - 3: ('мільярд', 'мільярды', 'мільярдаў'), # 10^9 - 4: ('трыльён', 'трыльёны', 'трыльёнаў'), # 10^12 - 5: ('квадрыльён', 'квадрыльёны', 'квадрыльёнаў'), # 10^15 - 6: ('квінтыльён', 'квінтыльёны', 'квінтыльёнаў'), # 10^18 - 7: ('секстыльён', 'секстыльёны', 'секстыльёнаў'), # 10^21 - 8: ('сэптыльён', 'сэптыльёны', 'сэптыльёнаў'), # 10^24 - 9: ('актыльён', 'актыльёны', 'актыльёнаў'), # 10^27 - 10: ('нанільён', 'нанільёны', 'нанільёнаў'), # 10^30 + 1: ("тысяча", "тысячы", "тысяч"), # 10^3 + 2: ("мільён", "мільёны", "мільёнаў"), # 10^6 + 3: ("мільярд", "мільярды", "мільярдаў"), # 10^9 + 4: ("трыльён", "трыльёны", "трыльёнаў"), # 10^12 + 5: ("квадрыльён", "квадрыльёны", "квадрыльёнаў"), # 10^15 + 6: ("квінтыльён", "квінтыльёны", "квінтыльёнаў"), # 10^18 + 7: ("секстыльён", "секстыльёны", "секстыльёнаў"), # 10^21 + 8: ("сэптыльён", "сэптыльёны", "сэптыльёнаў"), # 10^24 + 9: ("актыльён", "актыльёны", "актыльёнаў"), # 10^27 + 10: ("нанільён", "нанільёны", "нанільёнаў"), # 10^30 } class Num2Word_BY(Num2Word_Base): CURRENCY_FORMS = { - 'RUB': ( - ('расійскі рубель', 'расійскія рублі', 'расійскіх рублёў'), - ('капейка', 'капейкі', 'капеек') + "RUB": ( + ("расійскі рубель", "расійскія рублі", "расійскіх рублёў"), + ("капейка", "капейкі", "капеек"), ), - 'EUR': (('еўра', 'еўра', 'еўра'), ('цэнт', 'цэнты', 'цэнтаў')), - 'USD': (('долар', 'долары', 'долараў'), ('цэнт', 'цэнты', 'цэнтаў')), - 'UAH': (('грыўна', 'грыўны', 'грыўнаў'), ('капейка', 'капейкі', 'капеек')), - 'KZT': (('тэнге', 'тэнге', 'тэнге'), ('тыйін', 'тыйіны', 'тыйінаў')), - 'BYN': ( - ('беларускі рубель', 'беларускія рублі', 'беларускіх рублёў'), - ('капейка', 'капейкі', 'капеек') + "EUR": (("еўра", "еўра", "еўра"), ("цэнт", "цэнты", "цэнтаў")), + "USD": (("долар", "долары", "долараў"), ("цэнт", "цэнты", "цэнтаў")), + "UAH": ( + ("грыўна", "грыўны", "грыўнаў"), + ("капейка", "капейкі", "капеек"), ), - 'UZS': (('сум', 'сумы', 'сумаў'), ('тыйін', 'тыйіны', 'тыйінаў')), + "KZT": (("тэнге", "тэнге", "тэнге"), ("тыйін", "тыйіны", "тыйінаў")), + "BYN": ( + ("беларускі рубель", "беларускія рублі", "беларускіх рублёў"), + ("капейка", "капейкі", "капеек"), + ), + "UZS": (("сум", "сумы", "сумаў"), ("тыйін", "тыйіны", "тыйінаў")), } def setup(self): - self.negword = 'мінус' - self.pointword = 'коска' + self.negword = "мінус" + self.pointword = "коска" self.ords = { - 'нуль': 'нулявы', - 'адзін': 'першы', - 'два': 'другі', - 'тры': 'трэці', - 'чатыры': 'чацвёрты', - 'пяць': 'пяты', - 'шэсць': 'шосты', - 'сем': 'сёмы', - 'восем': 'восьмы', - 'дзевяць': 'дзявяты', - 'сто': 'соты', - 'тысяча': 'тысячны', + "нуль": "нулявы", + "адзін": "першы", + "два": "другі", + "тры": "трэці", + "чатыры": "чацвёрты", + "пяць": "пяты", + "шэсць": "шосты", + "сем": "сёмы", + "восем": "восьмы", + "дзевяць": "дзявяты", + "сто": "соты", + "тысяча": "тысячны", } self.ords_adjective = { - 'адзін': 'адна', - 'адна': 'адна', - 'дзве': 'двух', - 'тры': 'трох', - 'чатыры': 'чатырох', - 'пяць': 'пяці', - 'шэсць': 'шасці', - 'сем': 'сямі', - 'восем': 'васьмі', - 'дзевяць': 'дзевяцi', - 'сто': 'ста', + "адзін": "адна", + "адна": "адна", + "дзве": "двух", + "тры": "трох", + "чатыры": "чатырох", + "пяць": "пяці", + "шэсць": "шасці", + "сем": "сямі", + "восем": "васьмі", + "дзевяць": "дзевяцi", + "сто": "ста", } - def to_cardinal(self, number, gender='m'): - n = str(number).replace(',', '.') - if '.' in n: - left, right = n.split('.') - if set(right) == {'0'}: + def to_cardinal(self, number, gender="m"): + n = str(number).replace(",", ".") + if "." in n: + left, right = n.split(".") + if set(right) == {"0"}: leading_zero_count = 0 else: - leading_zero_count = len(right) - len(right.lstrip('0')) - - decimal_part = (ZERO + ' ') * \ - leading_zero_count + \ - self._int2word(int(right), gender) - return '{} {} {}'.format(self._int2word(int(left), gender), self.pointword, decimal_part) + leading_zero_count = len(right) - len(right.lstrip("0")) + + decimal_part = (ZERO + " ") * leading_zero_count + self._int2word( + int(right), gender + ) + return "{} {} {}".format( + self._int2word(int(left), gender), self.pointword, decimal_part + ) else: return self._int2word(int(n), gender) @@ -197,91 +202,99 @@ def pluralize(self, n, forms): form = 2 return forms[form] - def to_ordinal(self, number, gender='m'): + def to_ordinal(self, number, gender="m"): self.verify_ordinal(number) - outwords = self.to_cardinal(number, gender).split(' ') + outwords = self.to_cardinal(number, gender).split(" ") lastword = outwords[-1].lower() try: if len(outwords) > 1: if outwords[-2] in self.ords_adjective: - outwords[-2] = self.ords_adjective.get(outwords[-2], outwords[-2]) - elif outwords[-2] == 'дзесяць': - outwords[-2] = outwords[-2][:-1] + 'і' + outwords[-2] = self.ords_adjective.get( + outwords[-2], outwords[-2] + ) + elif outwords[-2] == "дзесяць": + outwords[-2] = outwords[-2][:-1] + "і" if len(outwords) == 3: - if outwords[-3] in ['адзін', 'адна']: - outwords[-3] = '' + if outwords[-3] in ["адзін", "адна"]: + outwords[-3] = "" lastword = self.ords[lastword] except KeyError: if lastword[:-3] in self.ords_adjective: - lastword = self.ords_adjective.get(lastword[:-3], lastword) + 'соты' - elif lastword[-5:] == 'шэсць': - lastword = 'шосты' - elif lastword[-7:] == 'дзесяць': - lastword = 'дзясяты' - elif lastword[-9:] == 'семдзесят': - lastword = 'сямідзясяты' - elif lastword[-1] == 'ь' or lastword[-2] == 'ц': - lastword = lastword[:-2] + 'ты' - elif lastword[-1] == 'к': - lastword = lastword.replace('о', 'а') + 'авы' - - elif lastword[-2] == 'ч' or lastword[-1] == 'ч': - if lastword[-2] == 'ч': - lastword = lastword[:-1] + 'ны' - if lastword[-1] == 'ч': - lastword = lastword + 'ны' - - if 'дву' in lastword[-2]: - lastword[-2].replace('дву', 'дзву') - - elif lastword[-1] == 'н' or lastword[-2] == 'н': - lastword = lastword[: lastword.rfind('н') + 1] + 'ны' - elif lastword[-1] == 'д' or lastword[-2] == 'д': - lastword = lastword[: lastword.rfind('д') + 1] + 'ны' - - if gender == 'f': - if lastword[-2:] in ['ці', ]: - lastword = lastword[:-2] + 'цяя' + lastword = ( + self.ords_adjective.get(lastword[:-3], lastword) + "соты" + ) + elif lastword[-5:] == "шэсць": + lastword = "шосты" + elif lastword[-7:] == "дзесяць": + lastword = "дзясяты" + elif lastword[-9:] == "семдзесят": + lastword = "сямідзясяты" + elif lastword[-1] == "ь" or lastword[-2] == "ц": + lastword = lastword[:-2] + "ты" + elif lastword[-1] == "к": + lastword = lastword.replace("о", "а") + "авы" + + elif lastword[-2] == "ч" or lastword[-1] == "ч": + if lastword[-2] == "ч": + lastword = lastword[:-1] + "ны" + if lastword[-1] == "ч": + lastword = lastword + "ны" + + if "дву" in lastword[-2]: + lastword[-2].replace("дву", "дзву") + + elif lastword[-1] == "н" or lastword[-2] == "н": + lastword = lastword[: lastword.rfind("н") + 1] + "ны" + elif lastword[-1] == "д" or lastword[-2] == "д": + lastword = lastword[: lastword.rfind("д") + 1] + "ны" + + if gender == "f": + if lastword[-2:] in [ + "ці", + ]: + lastword = lastword[:-2] + "цяя" else: - lastword = lastword[:-1] + 'ая' + lastword = lastword[:-1] + "ая" - if gender == 'n': - if lastword[-2:] == ['ці', ]: - lastword = lastword[:-2] + 'цяе' + if gender == "n": + if lastword[-2:] == [ + "ці", + ]: + lastword = lastword[:-2] + "цяе" else: - lastword = lastword[:-1] + 'ае' + lastword = lastword[:-1] + "ае" outwords[-1] = self.title(lastword) - if len(outwords) == 2 and 'адна' in outwords[-2]: + if len(outwords) == 2 and "адна" in outwords[-2]: outwords[-2] = outwords[-1] del outwords[-1] - if len(outwords) > 1 and 'тысяч' in outwords[-1]: + if len(outwords) > 1 and "тысяч" in outwords[-1]: outwords[-2] = outwords[-2] + outwords[-1] del outwords[-1] - return ' '.join(outwords).strip() + return " ".join(outwords).strip() def _money_verbose(self, number, currency): - gender = 'm' - if currency == 'UAH': - gender = 'f' + gender = "m" + if currency == "UAH": + gender = "f" return self._int2word(number, gender) def _cents_verbose(self, number, currency): - if currency in ('UAH', 'RUB', 'BYN'): - gender = 'f' + if currency in ("UAH", "RUB", "BYN"): + gender = "f" else: - gender = 'm' + gender = "m" return self._int2word(number, gender) - def _int2word(self, n, gender='m'): + def _int2word(self, n, gender="m"): if isinstance(gender, bool) and gender: - gender = 'f' + gender = "f" if n < 0: - return ' '.join([self.negword, self._int2word(abs(n), gender)]) + return " ".join([self.negword, self._int2word(abs(n), gender)]) if n == 0: return ZERO @@ -309,13 +322,13 @@ def _int2word(self, n, gender='m'): if i == 0: ones = ONES[gender] elif i == 1: - ones = ONES['f'] # Thousands are feminine + ones = ONES["f"] # Thousands are feminine else: - ones = ONES['m'] + ones = ONES["m"] words.append(ones[n1]) if i > 0: words.append(self.pluralize(x, THOUSANDS[i])) - return ' '.join(words) + return " ".join(words) diff --git a/num2words/lang_RU.py b/num2words/lang_RU.py index 23578921..db9b38d0 100644 --- a/num2words/lang_RU.py +++ b/num2words/lang_RU.py @@ -121,7 +121,8 @@ class Num2Word_RU(Num2Word_Base): ('сум', 'сума', 'сумов'), ('тийин', 'тийина', 'тийинов') ), 'PLN': ( - ('польский злотый', 'польских слотых', 'польских злотых'), ('грош', 'гроша', 'грошей') + ('польский злотый', 'польских слотых', 'польских злотых'), + ('грош', 'гроша', 'грошей') ), } diff --git a/tests/test_by.py b/tests/test_by.py index d381d146..fb50bf3a 100644 --- a/tests/test_by.py +++ b/tests/test_by.py @@ -24,325 +24,324 @@ class Num2WordsBYTest(TestCase): - def test_cardinal(self): - self.assertEqual(num2words(100, lang='by'), 'сто') - self.assertEqual(num2words(101, lang='by'), 'сто адзін') - self.assertEqual(num2words(110, lang='by'), 'сто дзесяць') - self.assertEqual(num2words(115, lang='by'), 'сто пятнаццаць') - self.assertEqual(num2words(123, lang='by'), 'сто дваццаць тры') - self.assertEqual(num2words(1000, lang='by'), 'адна тысяча') - self.assertEqual(num2words(1001, lang='by'), 'адна тысяча адзін') - self.assertEqual(num2words(2012, lang='by'), 'дзве тысячы дванаццаць') - self.assertEqual( - num2words(12519.85, lang='by'), - 'дванаццаць тысяч пяцьсот дзевятнаццаць коска восемдзесят пяць') - self.assertEqual( - num2words(1234567890, lang='by'), - 'адзін мільярд дзвесце трыццаць чатыры мільёны пяцьсот ' - 'шэсцьдзясят сем тысяч восемсот дзевяноста') - self.assertEqual( - num2words(461407892039002157189883901676, lang='by'), - 'чатырыста шэсцьдзясят адзін ' - 'актыльён чатырыста сем сэптыльёнаў восемсот дзевяноста ' - 'два секстыльёны трыццаць дзевяць квінтыльёнаў два квадрыльёны ' - 'сто пяцьдзясят сем трыльёнаў сто восемдзесят дзевяць мільярдаў ' - 'восемсот восемдзесят тры мільёны дзевяцьсот адна тысяча ' - 'шэсцьсот семдзесят шэсць') - self.assertEqual( - num2words(94234693663034822824384220291, lang='by'), - 'дзевяноста чатыры актыльёны ' - 'дзвесце трыццаць чатыры сэптыльёны шэсцьсот дзевяноста тры ' - 'секстыльёны шэсцьсот шэсцьдзясят тры квінтыльёны трыццаць ' - 'чатыры квадрыльёны восемсот дваццаць два трыльёны восемсот ' - 'дваццаць чатыры мільярды трыста восемдзесят чатыры мільёны ' - 'дзвесце дваццаць тысяч дзвесце дзевяноста адзін') - self.assertEqual(num2words(5, lang='by'), 'пяць') - self.assertEqual(num2words(15, lang='by'), 'пятнаццаць') - self.assertEqual(num2words(154, lang='by'), 'сто пяцьдзясят чатыры') - self.assertEqual( - num2words(1135, lang='by'), 'адна тысяча сто трыццаць пяць' - ) - self.assertEqual( - num2words(418531, lang='by'), - 'чатырыста васямнаццаць тысяч пяцьсот трыццаць адзін' - ) - self.assertEqual( - num2words(1000139, lang='by'), 'адзін мільён сто трыццаць дзевяць' - ) - self.assertEqual(num2words(-1, lang='by'), 'мінус адзін') - self.assertEqual(num2words(-15, lang='by'), 'мінус пятнаццаць') - self.assertEqual(num2words(-100, lang='by'), 'мінус сто') - - def test_floating_point(self): - self.assertEqual(num2words(5.2, lang='by'), 'пяць коска два') + self.assertEqual(num2words(100, lang="by"), "сто") + self.assertEqual(num2words(101, lang="by"), "сто адзін") + self.assertEqual(num2words(110, lang="by"), "сто дзесяць") + self.assertEqual(num2words(115, lang="by"), "сто пятнаццаць") + self.assertEqual(num2words(123, lang="by"), "сто дваццаць тры") + self.assertEqual(num2words(1000, lang="by"), "адна тысяча") + self.assertEqual(num2words(1001, lang="by"), "адна тысяча адзін") + self.assertEqual(num2words(2012, lang="by"), "дзве тысячы дванаццаць") self.assertEqual( - num2words(10.02, lang='by'), - 'дзесяць коска нуль два' + num2words(12519.85, lang="by"), + "дванаццаць тысяч пяцьсот дзевятнаццаць коска восемдзесят пяць", ) self.assertEqual( - num2words(15.007, lang='by'), - 'пятнаццаць коска нуль нуль сем' + num2words(1234567890, lang="by"), + "адзін мільярд дзвесце трыццаць чатыры мільёны пяцьсот " + "шэсцьдзясят сем тысяч восемсот дзевяноста", ) self.assertEqual( - num2words(561.42, lang='by'), - 'пяцьсот шэсцьдзясят адзін коска сорак два' + num2words(461407892039002157189883901676, lang="by"), + "чатырыста шэсцьдзясят адзін " + "актыльён чатырыста сем сэптыльёнаў восемсот дзевяноста " + "два секстыльёны трыццаць дзевяць квінтыльёнаў два квадрыльёны " + "сто пяцьдзясят сем трыльёнаў сто восемдзесят дзевяць мільярдаў " + "восемсот восемдзесят тры мільёны дзевяцьсот адна тысяча " + "шэсцьсот семдзесят шэсць", ) - self.assertEqual( - num2words(561.0, lang='by'), - 'пяцьсот шэсцьдзясят адзін коска нуль' + num2words(94234693663034822824384220291, lang="by"), + "дзевяноста чатыры актыльёны " + "дзвесце трыццаць чатыры сэптыльёны шэсцьсот дзевяноста тры " + "секстыльёны шэсцьсот шэсцьдзясят тры квінтыльёны трыццаць " + "чатыры квадрыльёны восемсот дваццаць два трыльёны восемсот " + "дваццаць чатыры мільярды трыста восемдзесят чатыры мільёны " + "дзвесце дваццаць тысяч дзвесце дзевяноста адзін", ) - - def test_to_ordinal(self): + self.assertEqual(num2words(5, lang="by"), "пяць") + self.assertEqual(num2words(15, lang="by"), "пятнаццаць") + self.assertEqual(num2words(154, lang="by"), "сто пяцьдзясят чатыры") self.assertEqual( - num2words(1, lang='by', to='ordinal'), - 'першы' + num2words(1135, lang="by"), "адна тысяча сто трыццаць пяць" ) self.assertEqual( - num2words(5, lang='by', to='ordinal'), - 'пяты' + num2words(418531, lang="by"), + "чатырыста васямнаццаць тысяч пяцьсот трыццаць адзін", ) self.assertEqual( - num2words(10, lang='by', to='ordinal'), - 'дзясяты' + num2words(1000139, lang="by"), "адзін мільён сто трыццаць дзевяць" ) + self.assertEqual(num2words(-1, lang="by"), "мінус адзін") + self.assertEqual(num2words(-15, lang="by"), "мінус пятнаццаць") + self.assertEqual(num2words(-100, lang="by"), "мінус сто") + def test_floating_point(self): + self.assertEqual(num2words(5.2, lang="by"), "пяць коска два") + self.assertEqual(num2words(10.02, lang="by"), "дзесяць коска нуль два") self.assertEqual( - num2words(13, lang='by', to='ordinal'), - 'трынаццаты' - ) - self.assertEqual( - num2words(20, lang='by', to='ordinal'), - 'дваццаты' - ) - self.assertEqual( - num2words(23, lang='by', to='ordinal'), - 'дваццаць трэці' - ) - self.assertEqual( - num2words(23, lang='by', to='ordinal', gender='f'), - 'дваццаць трэцяя' + num2words(15.007, lang="by"), "пятнаццаць коска нуль нуль сем" ) self.assertEqual( - num2words(40, lang='by', to='ordinal'), - 'саракавы' + num2words(561.42, lang="by"), + "пяцьсот шэсцьдзясят адзін коска сорак два", ) + self.assertEqual( - num2words(61, lang='by', to='ordinal'), - 'шэсцьдзясят першы' + num2words(561.0, lang="by"), "пяцьсот шэсцьдзясят адзін коска нуль" ) + + def test_to_ordinal(self): + self.assertEqual(num2words(1, lang="by", to="ordinal"), "першы") + self.assertEqual(num2words(5, lang="by", to="ordinal"), "пяты") + self.assertEqual(num2words(10, lang="by", to="ordinal"), "дзясяты") + + self.assertEqual(num2words(13, lang="by", to="ordinal"), "трынаццаты") + self.assertEqual(num2words(20, lang="by", to="ordinal"), "дваццаты") self.assertEqual( - num2words(70, lang='by', to='ordinal'), - 'сямідзясяты' + num2words(23, lang="by", to="ordinal"), "дваццаць трэці" ) self.assertEqual( - num2words(100, lang='by', to='ordinal'), - 'соты' + num2words(23, lang="by", to="ordinal", gender="f"), + "дваццаць трэцяя", ) + self.assertEqual(num2words(40, lang="by", to="ordinal"), "саракавы") self.assertEqual( - num2words(136, lang='by', to='ordinal'), - 'сто трыццаць шосты' + num2words(61, lang="by", to="ordinal"), "шэсцьдзясят першы" ) + self.assertEqual(num2words(70, lang="by", to="ordinal"), "сямідзясяты") + self.assertEqual(num2words(100, lang="by", to="ordinal"), "соты") self.assertEqual( - num2words(500, lang='by', to='ordinal'), - 'пяцісоты' + num2words(136, lang="by", to="ordinal"), "сто трыццаць шосты" ) + self.assertEqual(num2words(500, lang="by", to="ordinal"), "пяцісоты") self.assertEqual( - num2words(500, lang='by', to='ordinal', gender='f'), - 'пяцісотая' + num2words(500, lang="by", to="ordinal", gender="f"), "пяцісотая" ) self.assertEqual( - num2words(500, lang='by', to='ordinal', gender='n'), - 'пяцісотае' + num2words(500, lang="by", to="ordinal", gender="n"), "пяцісотае" ) - self.assertEqual( - num2words(1000, lang='by', to='ordinal'), - 'тысячны' - ) + self.assertEqual(num2words(1000, lang="by", to="ordinal"), "тысячны") self.assertEqual( - num2words(1000, lang='by', to='ordinal', gender='f'), - 'тысячная' + num2words(1000, lang="by", to="ordinal", gender="f"), "тысячная" ) self.assertEqual( - num2words(1000, lang='by', to='ordinal', gender='n'), - 'тысячнае' + num2words(1000, lang="by", to="ordinal", gender="n"), "тысячнае" ) self.assertEqual( - num2words(1001, lang='by', to='ordinal'), - 'тысяча першы' + num2words(1001, lang="by", to="ordinal"), "тысяча першы" ) self.assertEqual( - num2words(2000, lang='by', to='ordinal'), - 'двухтысячны' + num2words(2000, lang="by", to="ordinal"), "двухтысячны" ) self.assertEqual( - num2words(10000, lang='by', to='ordinal'), - 'дзесяцітысячны' + num2words(10000, lang="by", to="ordinal"), "дзесяцітысячны" ) self.assertEqual( - num2words(1000000, lang='by', to='ordinal'), - 'мільённы' + num2words(1000000, lang="by", to="ordinal"), "мільённы" ) self.assertEqual( - num2words(1000000000, lang='by', to='ordinal'), - 'мільярдны' + num2words(1000000000, lang="by", to="ordinal"), "мільярдны" ) def test_to_currency(self): self.assertEqual( - num2words(1.0, lang='by', to='currency', currency='EUR'), - 'адзін еўра, нуль цэнтаў' + num2words(1.0, lang="by", to="currency", currency="EUR"), + "адзін еўра, нуль цэнтаў", ) self.assertEqual( - num2words(1.0, lang='by', to='currency', currency='RUB'), - 'адзін расійскі рубель, нуль капеек' + num2words(1.0, lang="by", to="currency", currency="RUB"), + "адзін расійскі рубель, нуль капеек", ) self.assertEqual( - num2words(1.0, lang='by', to='currency', currency='BYN'), - 'адзін беларускі рубель, нуль капеек' + num2words(1.0, lang="by", to="currency", currency="BYN"), + "адзін беларускі рубель, нуль капеек", ) self.assertEqual( - num2words(1.0, lang='by', to='currency', currency='UAH'), - 'адна грыўна, нуль капеек' + num2words(1.0, lang="by", to="currency", currency="UAH"), + "адна грыўна, нуль капеек", ) self.assertEqual( - num2words(1234.56, lang='by', to='currency', currency='EUR'), - 'адна тысяча дзвесце трыццаць чатыры еўра, пяцьдзясят шэсць цэнтаў' + num2words(1234.56, lang="by", to="currency", currency="EUR"), + "адна тысяча дзвесце трыццаць чатыры еўра, " + "пяцьдзясят шэсць цэнтаў", ) self.assertEqual( - num2words(1234.56, lang='by', to='currency', currency='RUB'), - 'адна тысяча дзвесце трыццаць чатыры расійскія рублі, пяцьдзясят шэсць капеек' + num2words(1234.56, lang="by", to="currency", currency="RUB"), + "адна тысяча дзвесце трыццаць чатыры расійскія рублі, " + "пяцьдзясят шэсць капеек", ) self.assertEqual( - num2words(1234.56, lang='by', to='currency', currency='BYN'), - 'адна тысяча дзвесце трыццаць чатыры беларускія рублі, пяцьдзясят шэсць капеек' + num2words(1234.56, lang="by", to="currency", currency="BYN"), + "адна тысяча дзвесце трыццаць чатыры беларускія рублі, " + "пяцьдзясят шэсць капеек", ) self.assertEqual( - num2words(1234.56, lang='by', to='currency', currency='UAH'), - 'адна тысяча дзвесце трыццаць чатыры грыўны, пяцьдзясят шэсць капеек' + num2words(1234.56, lang="by", to="currency", currency="UAH"), + "адна тысяча дзвесце трыццаць чатыры грыўны, " + "пяцьдзясят шэсць капеек", ) self.assertEqual( - num2words(10111, lang='by', to='currency', currency='EUR', - separator=' і'), - 'сто адзін еўра і адзінаццаць цэнтаў' + num2words( + 10111, lang="by", to="currency", currency="EUR", separator=" і" + ), + "сто адзін еўра і адзінаццаць цэнтаў", ) self.assertEqual( - num2words(10111, lang='by', to='currency', currency='RUB', - separator=' і'), - 'сто адзін расійскі рубель і адзінаццаць капеек' + num2words( + 10111, lang="by", to="currency", currency="RUB", separator=" і" + ), + "сто адзін расійскі рубель і адзінаццаць капеек", ) self.assertEqual( - num2words(10111, lang='by', to='currency', currency='BYN', - separator=' і'), - 'сто адзін беларускі рубель і адзінаццаць капеек' + num2words( + 10111, lang="by", to="currency", currency="BYN", separator=" і" + ), + "сто адзін беларускі рубель і адзінаццаць капеек", ) self.assertEqual( - num2words(10111, lang='by', to='currency', currency='UAH', - separator=' і'), - 'сто адна грыўна і адзінаццаць капеек' + num2words( + 10111, lang="by", to="currency", currency="UAH", separator=" і" + ), + "сто адна грыўна і адзінаццаць капеек", ) self.assertEqual( - num2words(10121, lang='by', to='currency', currency='EUR', - separator=' і'), - 'сто адзін еўра і дваццаць адзін цэнт' + num2words( + 10121, lang="by", to="currency", currency="EUR", separator=" і" + ), + "сто адзін еўра і дваццаць адзін цэнт", ) self.assertEqual( - num2words(10121, lang='by', to='currency', currency='RUB', - separator=' і'), - 'сто адзін расійскі рубель і дваццаць адна капейка' + num2words( + 10121, lang="by", to="currency", currency="RUB", separator=" і" + ), + "сто адзін расійскі рубель і дваццаць адна капейка", ) self.assertEqual( - num2words(10121, lang='by', to='currency', currency='BYN', - separator=' і'), - 'сто адзін беларускі рубель і дваццаць адна капейка' + num2words( + 10121, lang="by", to="currency", currency="BYN", separator=" і" + ), + "сто адзін беларускі рубель і дваццаць адна капейка", ) self.assertEqual( - num2words(10121, lang='by', to='currency', currency='UAH', - separator=' і'), - 'сто адна грыўна і дваццаць адна капейка' + num2words( + 10121, lang="by", to="currency", currency="UAH", separator=" і" + ), + "сто адна грыўна і дваццаць адна капейка", ) self.assertEqual( - num2words(10122, lang='by', to='currency', currency='EUR', - separator=' і'), - 'сто адзін еўра і дваццаць два цэнты' + num2words( + 10122, lang="by", to="currency", currency="EUR", separator=" і" + ), + "сто адзін еўра і дваццаць два цэнты", ) self.assertEqual( - num2words(10122, lang='by', to='currency', currency='RUB', - separator=' і'), - 'сто адзін расійскі рубель і дваццаць дзве капейкі' + num2words( + 10122, lang="by", to="currency", currency="RUB", separator=" і" + ), + "сто адзін расійскі рубель і дваццаць дзве капейкі", ) self.assertEqual( - num2words(10122, lang='by', to='currency', currency='BYN', - separator=' і'), - 'сто адзін беларускі рубель і дваццаць дзве капейкі' + num2words( + 10122, lang="by", to="currency", currency="BYN", separator=" і" + ), + "сто адзін беларускі рубель і дваццаць дзве капейкі", ) self.assertEqual( - num2words(10122, lang='by', to='currency', currency='UAH', - separator=' і'), - 'сто адна грыўна і дваццаць дзве капейкі' + num2words( + 10122, lang="by", to="currency", currency="UAH", separator=" і" + ), + "сто адна грыўна і дваццаць дзве капейкі", ) self.assertEqual( - num2words(10122, lang='by', to='currency', currency='KZT', - separator=' і'), - 'сто адзін тэнге і дваццаць два тыйіны' + num2words( + 10122, lang="by", to="currency", currency="KZT", separator=" і" + ), + "сто адзін тэнге і дваццаць два тыйіны", ) self.assertEqual( - num2words(-1251985, lang='by', to='currency', currency='EUR', - cents=False), - 'мінус дванаццаць тысяч пяцьсот дзевятнаццаць еўра, 85 цэнтаў' + num2words( + -1251985, lang="by", to="currency", currency="EUR", cents=False + ), + "мінус дванаццаць тысяч пяцьсот дзевятнаццаць еўра, 85 цэнтаў", ) self.assertEqual( - num2words(-1251985, lang='by', to='currency', currency='RUB', - cents=False), - 'мінус дванаццаць тысяч пяцьсот дзевятнаццаць расійскіх рублёў, 85 капеек' + num2words( + -1251985, lang="by", to="currency", currency="RUB", cents=False + ), + "мінус дванаццаць тысяч пяцьсот дзевятнаццаць " + "расійскіх рублёў, 85 капеек", ) self.assertEqual( - num2words(-1251985, lang='by', to='currency', currency='BYN', - cents=False), - 'мінус дванаццаць тысяч пяцьсот дзевятнаццаць беларускіх рублёў, 85 капеек' + num2words( + -1251985, lang="by", to="currency", currency="BYN", cents=False + ), + "мінус дванаццаць тысяч пяцьсот дзевятнаццаць " + "беларускіх рублёў, 85 капеек", ) self.assertEqual( - num2words(-1251985, lang='by', to='currency', currency='UAH', - cents=False), - 'мінус дванаццаць тысяч пяцьсот дзевятнаццаць грыўнаў, 85 капеек' + num2words( + -1251985, lang="by", to="currency", currency="UAH", cents=False + ), + "мінус дванаццаць тысяч пяцьсот дзевятнаццаць грыўнаў, 85 капеек", ) self.assertEqual( - num2words('38.4', lang='by', to='currency', separator=' і', - cents=False, currency='EUR'), - 'трыццаць восем еўра і 40 цэнтаў' + num2words( + "38.4", + lang="by", + to="currency", + separator=" і", + cents=False, + currency="EUR", + ), + "трыццаць восем еўра і 40 цэнтаў", ) self.assertEqual( - num2words('38.4', lang='by', to='currency', separator=' і', - cents=False, currency='RUB'), - 'трыццаць восем расійскіх рублёў і 40 капеек' + num2words( + "38.4", + lang="by", + to="currency", + separator=" і", + cents=False, + currency="RUB", + ), + "трыццаць восем расійскіх рублёў і 40 капеек", ) self.assertEqual( - num2words('38.4', lang='by', to='currency', separator=' і', - cents=False, currency='UAH'), - 'трыццаць восем грыўнаў і 40 капеек' + num2words( + "38.4", + lang="by", + to="currency", + separator=" і", + cents=False, + currency="UAH", + ), + "трыццаць восем грыўнаў і 40 капеек", ) self.assertEqual( - num2words('1230.56', lang='by', to='currency', currency='USD'), - 'адна тысяча дзвесце трыццаць долараў, пяцьдзясят шэсць цэнтаў' + num2words("1230.56", lang="by", to="currency", currency="USD"), + "адна тысяча дзвесце трыццаць долараў, пяцьдзясят шэсць цэнтаў", ) self.assertEqual( - num2words('1231.56', lang='by', to='currency', currency='USD'), - 'адна тысяча дзвесце трыццаць адзін долар, пяцьдзясят шэсць цэнтаў' + num2words("1231.56", lang="by", to="currency", currency="USD"), + "адна тысяча дзвесце трыццаць адзін долар, " + "пяцьдзясят шэсць цэнтаў", ) self.assertEqual( - num2words('1234.56', lang='by', to='currency', currency='USD'), - 'адна тысяча дзвесце трыццаць чатыры долары, пяцьдзясят шэсць ' - 'цэнтаў' + num2words("1234.56", lang="by", to="currency", currency="USD"), + "адна тысяча дзвесце трыццаць чатыры долары, пяцьдзясят шэсць " + "цэнтаў", ) self.assertEqual( - num2words(10122, lang='by', to='currency', currency='UZS', - separator=' і'), - 'сто адзін сум і дваццаць два тыйіны' + num2words( + 10122, lang="by", to="currency", currency="UZS", separator=" і" + ), + "сто адзін сум і дваццаць два тыйіны", ) diff --git a/tests/test_errors.py b/tests/test_errors.py index 096b99c3..a25553f5 100644 --- a/tests/test_errors.py +++ b/tests/test_errors.py @@ -28,7 +28,6 @@ def test_NotImplementedError(self): with self.assertRaises(NotImplementedError): num2words(100, lang="lalala") - def test_types_NotImplementedError(self): with self.assertRaises(NotImplementedError): num2words(100, lang="en", to='babidibibidiboo') From d1229aa4f289deaeecccddb31c4370fe4e1522ef Mon Sep 17 00:00:00 2001 From: SkiBY Date: Fri, 18 Aug 2023 18:10:22 +0200 Subject: [PATCH 10/12] increase of coverage --- num2words/lang_BY.py | 16 ++++++++++------ tests/test_by.py | 8 ++++++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/num2words/lang_BY.py b/num2words/lang_BY.py index c178149f..f0ace74e 100644 --- a/num2words/lang_BY.py +++ b/num2words/lang_BY.py @@ -240,8 +240,6 @@ def to_ordinal(self, number, gender="m"): if lastword[-1] == "ч": lastword = lastword + "ны" - if "дву" in lastword[-2]: - lastword[-2].replace("дву", "дзву") elif lastword[-1] == "н" or lastword[-2] == "н": lastword = lastword[: lastword.rfind("н") + 1] + "ны" @@ -257,8 +255,8 @@ def to_ordinal(self, number, gender="m"): lastword = lastword[:-1] + "ая" if gender == "n": - if lastword[-2:] == [ - "ці", + if lastword[-2:] in [ + "ці", "ца" ]: lastword = lastword[:-2] + "цяе" else: @@ -269,10 +267,16 @@ def to_ordinal(self, number, gender="m"): outwords[-2] = outwords[-1] del outwords[-1] - if len(outwords) > 1 and "тысяч" in outwords[-1]: - outwords[-2] = outwords[-2] + outwords[-1] + if len(outwords) > 2 and "тысяч" in outwords[-1]: + if 'сорак' in outwords[-3]: + outwords[-3] = outwords[-3].replace('сорак', 'сарака') + outwords[-3] = outwords[-3] + outwords[-2] + outwords[-1] + del outwords[-1] del outwords[-1] + elif len(outwords) > 1 and "тысяч" in outwords[-1]: + outwords[-2] = outwords[-2] + outwords[-1] + del outwords[-1] return " ".join(outwords).strip() def _money_verbose(self, number, currency): diff --git a/tests/test_by.py b/tests/test_by.py index fb50bf3a..087c0c11 100644 --- a/tests/test_by.py +++ b/tests/test_by.py @@ -95,6 +95,7 @@ def test_floating_point(self): def test_to_ordinal(self): self.assertEqual(num2words(1, lang="by", to="ordinal"), "першы") self.assertEqual(num2words(5, lang="by", to="ordinal"), "пяты") + self.assertEqual(num2words(6, lang="by", to="ordinal"), "шосты") self.assertEqual(num2words(10, lang="by", to="ordinal"), "дзясяты") self.assertEqual(num2words(13, lang="by", to="ordinal"), "трынаццаты") @@ -106,6 +107,10 @@ def test_to_ordinal(self): num2words(23, lang="by", to="ordinal", gender="f"), "дваццаць трэцяя", ) + self.assertEqual( + num2words(23, lang="by", to="ordinal", gender="n"), + "дваццаць трэцяе", + ) self.assertEqual(num2words(40, lang="by", to="ordinal"), "саракавы") self.assertEqual( num2words(61, lang="by", to="ordinal"), "шэсцьдзясят першы" @@ -144,6 +149,9 @@ def test_to_ordinal(self): self.assertEqual( num2words(10000, lang="by", to="ordinal"), "дзесяцітысячны" ) + self.assertEqual( + num2words(42000, lang="by", to="ordinal"), "саракадвухтысячны" + ) self.assertEqual( num2words(1000000, lang="by", to="ordinal"), "мільённы" ) From 125140690caff1277e1d2f760f171e88c748e102 Mon Sep 17 00:00:00 2001 From: SkiBY Date: Mon, 16 Oct 2023 22:38:17 +0200 Subject: [PATCH 11/12] [FIX]isort and flake returned [FIX]isort and flake returned --- num2words/lang_BY.py | 1 - tox.ini | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/num2words/lang_BY.py b/num2words/lang_BY.py index f0ace74e..ec825fd0 100644 --- a/num2words/lang_BY.py +++ b/num2words/lang_BY.py @@ -240,7 +240,6 @@ def to_ordinal(self, number, gender="m"): if lastword[-1] == "ч": lastword = lastword + "ны" - elif lastword[-1] == "н" or lastword[-2] == "н": lastword = lastword[: lastword.rfind("н") + 1] + "ны" elif lastword[-1] == "д" or lastword[-2] == "д": diff --git a/tox.ini b/tox.ini index 71beb41b..8e334bcf 100644 --- a/tox.ini +++ b/tox.ini @@ -6,7 +6,7 @@ python = 3.7: py37 3.8: py38 3.9: py39 - 3.10: py310 + 3.10: isort, flake8, py310 3.11: py311 From 54b9701d536e1bf76005df575e39a0a74086168f Mon Sep 17 00:00:00 2001 From: SkiBY Date: Tue, 17 Oct 2023 10:39:22 +0200 Subject: [PATCH 12/12] touch --- tests/test_errors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_errors.py b/tests/test_errors.py index a25553f5..3b53c80a 100644 --- a/tests/test_errors.py +++ b/tests/test_errors.py @@ -30,4 +30,4 @@ def test_NotImplementedError(self): def test_types_NotImplementedError(self): with self.assertRaises(NotImplementedError): - num2words(100, lang="en", to='babidibibidiboo') + num2words(100, lang="en", to='babidibibidiboo!')