mirror of
https://github.com/bblaz/num2words.git
synced 2025-12-06 06:42:25 +00:00
[ADD] polish ordinal numbers (#367)
This commit is contained in:
committed by
Willem Van Onsem
parent
5cb46055d7
commit
ea82fe11ca
@@ -36,6 +36,28 @@ ONES = {
|
|||||||
9: ('dziewięć',),
|
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 = {
|
TENS = {
|
||||||
0: ('dziesięć',),
|
0: ('dziesięć',),
|
||||||
1: ('jedenaście',),
|
1: ('jedenaście',),
|
||||||
@@ -49,6 +71,7 @@ TENS = {
|
|||||||
9: ('dziewiętnaście',),
|
9: ('dziewiętnaście',),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TWENTIES = {
|
TWENTIES = {
|
||||||
2: ('dwadzieścia',),
|
2: ('dwadzieścia',),
|
||||||
3: ('trzydzieści',),
|
3: ('trzydzieści',),
|
||||||
@@ -60,6 +83,17 @@ TWENTIES = {
|
|||||||
9: ('dziewięćdzisiąt',),
|
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 = {
|
HUNDREDS = {
|
||||||
1: ('sto',),
|
1: ('sto',),
|
||||||
2: ('dwieście',),
|
2: ('dwieście',),
|
||||||
@@ -72,10 +106,28 @@ HUNDREDS = {
|
|||||||
9: ('dziewięćset',),
|
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 = {
|
THOUSANDS = {
|
||||||
1: ('tysiąc', 'tysiące', 'tysięcy'), # 10^3
|
1: ('tysiąc', 'tysiące', 'tysięcy'), # 10^3
|
||||||
}
|
}
|
||||||
|
|
||||||
|
prefixes_ordinal = {
|
||||||
|
1: "tysięczny",
|
||||||
|
2: "milionowy",
|
||||||
|
3: "milairdowy"
|
||||||
|
}
|
||||||
|
|
||||||
prefixes = ( # 10^(6*x)
|
prefixes = ( # 10^(6*x)
|
||||||
"mi", # 10^6
|
"mi", # 10^6
|
||||||
"bi", # 10^12
|
"bi", # 10^12
|
||||||
@@ -130,8 +182,48 @@ class Num2Word_PL(Num2Word_Base):
|
|||||||
form = 2
|
form = 2
|
||||||
return forms[form]
|
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):
|
def to_ordinal(self, number):
|
||||||
|
if number % 1 != 0:
|
||||||
raise NotImplementedError()
|
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):
|
def _int2word(self, n):
|
||||||
if n == 0:
|
if n == 0:
|
||||||
|
|||||||
@@ -83,9 +83,32 @@ class Num2WordsPLTest(TestCase):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def test_to_ordinal(self):
|
def test_to_ordinal(self):
|
||||||
# @TODO: implement to_ordinal
|
self.assertEqual(num2words(100, lang='pl', to='ordinal'), "setny")
|
||||||
with self.assertRaises(NotImplementedError):
|
self.assertEqual(
|
||||||
num2words(1, lang='pl', to='ordinal')
|
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):
|
def test_currency(self):
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
|
|||||||
Reference in New Issue
Block a user