diff --git a/num2words/lang_PL.py b/num2words/lang_PL.py index 2fa52f7..0f2bd75 100644 --- a/num2words/lang_PL.py +++ b/num2words/lang_PL.py @@ -36,6 +36,28 @@ ONES = { 9: ('dziewięć',), } +ONES_ORDINALS = { + 1: ('pierwszy', "pierwszo"), + 2: ('drugi', "dwu"), + 3: ('trzeci', "trzy"), + 4: ('czwarty', "cztero"), + 5: ('piąty', "pięcio"), + 6: ('szósty', "sześcio"), + 7: ('siódmy', "siedmio"), + 8: ('ósmy', "ośmio"), + 9: ('dziewiąty', "dziewięcio"), + 10: ('dziesiąty', "dziesięcio"), + 11: ('jedenasty', "jedenasto"), + 12: ('dwunasty', "dwunasto"), + 13: ('trzynasty', "trzynasto"), + 14: ('czternasty', "czternasto"), + 15: ('piętnasty', "piętnasto"), + 16: ('szesnasty', "szesnasto"), + 17: ('siedemnasty', "siedemnasto"), + 18: ('osiemnasty', "osiemnasto"), + 19: ('dziewiętnasty', "dziewiętnasto"), +} + TENS = { 0: ('dziesięć',), 1: ('jedenaście',), @@ -49,6 +71,7 @@ TENS = { 9: ('dziewiętnaście',), } + TWENTIES = { 2: ('dwadzieścia',), 3: ('trzydzieści',), @@ -60,6 +83,17 @@ TWENTIES = { 9: ('dziewięćdzisiąt',), } +TWENTIES_ORDINALS = { + 2: ('dwudziesty', "dwudziesto"), + 3: ('trzydziesty', "trzydiesto"), + 4: ('czterdziesty', "czterdziesto"), + 5: ('pięćdziesiąty', "pięćdziesięcio"), + 6: ('sześćdziesiąty', "sześćdziesięcio"), + 7: ('siedemdziesiąty', "siedemdziesięcio"), + 8: ('osiemdziesiąty', "osiemdziesięcio"), + 9: ('dziewięćdzisiąty', "dziewięćdziesięcio"), +} + HUNDREDS = { 1: ('sto',), 2: ('dwieście',), @@ -72,10 +106,28 @@ HUNDREDS = { 9: ('dziewięćset',), } +HUNDREDS_ORDINALS = { + 1: ('setny', "stu"), + 2: ('dwusetny', "dwustu"), + 3: ('trzysetny', "trzystu"), + 4: ('czterysetny', "czterystu"), + 5: ('pięćsetny', "pięcset"), + 6: ('sześćsetny', "sześćset"), + 7: ('siedemsetny', "siedemset"), + 8: ('osiemsetny', "ośiemset"), + 9: ('dziewięćsetny', "dziewięćset"), +} + THOUSANDS = { 1: ('tysiąc', 'tysiące', 'tysięcy'), # 10^3 } +prefixes_ordinal = { + 1: "tysięczny", + 2: "milionowy", + 3: "milairdowy" +} + prefixes = ( # 10^(6*x) "mi", # 10^6 "bi", # 10^12 @@ -130,8 +182,48 @@ class Num2Word_PL(Num2Word_Base): form = 2 return forms[form] + def last_fragment_to_ordinal(self, last, words, level): + n1, n2, n3 = get_digits(last) + last_two = n2*10+n1 + if last_two == 0: + words.append(HUNDREDS_ORDINALS[n3][level]) + elif level == 1 and last == 1: + return + elif last_two < 20: + if n3 > 0: + words.append(HUNDREDS[n3][level]) + words.append(ONES_ORDINALS[last_two][level]) + elif last_two % 10 == 0: + if n3 > 0: + words.append(HUNDREDS[n3][level]) + words.append(TWENTIES_ORDINALS[n2][level]) + else: + if n3 > 0: + words.append(HUNDREDS[n3][0]) + words.append(TWENTIES_ORDINALS[n2][0]) + words.append(ONES_ORDINALS[n1][0]) + def to_ordinal(self, number): - raise NotImplementedError() + if number % 1 != 0: + raise NotImplementedError() + words = [] + fragments = list(splitbyx(str(number), 3)) + level = 0 + last = fragments[-1] + while last == 0: + level = level+1 + fragments.pop() + last = fragments[-1] + if len(fragments) > 1: + pre_part = self._int2word(number-(last*1000**level)) + words.append(pre_part) + self.last_fragment_to_ordinal(last, words, 0 if level == 0 else 1) + output = " ".join(words) + if last == 1 and level > 0 and output != "": + output = output + " " + if level > 0: + output = output + prefixes_ordinal[level] + return output def _int2word(self, n): if n == 0: diff --git a/tests/test_pl.py b/tests/test_pl.py index ec76ed8..a268c26 100644 --- a/tests/test_pl.py +++ b/tests/test_pl.py @@ -83,9 +83,32 @@ class Num2WordsPLTest(TestCase): ) def test_to_ordinal(self): - # @TODO: implement to_ordinal - with self.assertRaises(NotImplementedError): - num2words(1, lang='pl', to='ordinal') + self.assertEqual(num2words(100, lang='pl', to='ordinal'), "setny") + self.assertEqual( + num2words(101, lang='pl', to='ordinal'), "sto pierwszy") + self.assertEqual(num2words(121, lang='pl', to='ordinal'), + "sto dwudziesty pierwszy") + self.assertEqual( + num2words(115, lang='pl', to='ordinal'), "sto piętnasty") + self.assertEqual( + num2words(25, lang='pl', to='ordinal'), "dwudziesty piąty") + self.assertEqual(num2words(1021, lang='pl', to='ordinal'), + "tysiąc dwudziesty pierwszy") + self.assertEqual( + num2words(120, lang='pl', to='ordinal'), "sto dwudziesty") + self.assertEqual(num2words(1000021, lang='pl', + to='ordinal'), "milion dwudziesty pierwszy") + self.assertEqual(num2words(1000, lang='pl', to='ordinal'), "tysięczny") + self.assertEqual(num2words(10000, lang='pl', + to='ordinal'), "dziesięciotysięczny") + self.assertEqual(num2words(100000000, lang='pl', + to='ordinal'), "stumilionowy") + self.assertEqual(num2words(1002000, lang='pl', + to='ordinal'), "milion dwutysięczny") + self.assertEqual(num2words(1001000, lang='pl', + to='ordinal'), "milion tysięczny") + self.assertEqual(num2words(1000000, lang='pl', + to='ordinal'), "milionowy") def test_currency(self): self.assertEqual(