Skip to content

Commit

Permalink
[ADD] polish ordinal numbers (#367)
Browse files Browse the repository at this point in the history
  • Loading branch information
PaulinaKomorek committed Apr 23, 2021
1 parent 8cc0e24 commit 3f5f616
Show file tree
Hide file tree
Showing 2 changed files with 119 additions and 4 deletions.
94 changes: 93 additions & 1 deletion num2words/lang_PL.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,28 @@
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',),
Expand All @@ -49,6 +71,7 @@
9: ('dziewiętnaście',),
}


TWENTIES = {
2: ('dwadzieścia',),
3: ('trzydzieści',),
Expand All @@ -60,6 +83,17 @@
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',),
Expand All @@ -72,10 +106,28 @@
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
Expand Down Expand Up @@ -130,8 +182,48 @@ def pluralize(self, n, forms):
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:
Expand Down
29 changes: 26 additions & 3 deletions tests/test_pl.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,9 +83,32 @@ def test_cardinal(self):
)

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(
Expand Down

0 comments on commit 3f5f616

Please sign in to comment.