From 0398d164600c57e48f41697d588ef4150c40a9bb Mon Sep 17 00:00:00 2001 From: Zeno Gantner Date: Sun, 13 Jan 2019 23:04:10 +0100 Subject: [PATCH 1/5] German: 2 more ordinal tests --- tests/test_de.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/test_de.py b/tests/test_de.py index d20794d..2715e7f 100644 --- a/tests/test_de.py +++ b/tests/test_de.py @@ -23,7 +23,10 @@ from num2words import num2words class Num2WordsDETest(TestCase): + def test_ordinal_less_than_twenty(self): + self.assertEqual(num2words(0, ordinal=True, lang='de'), "nullte") + self.assertEqual(num2words(1, ordinal=True, lang='de'), "erste") self.assertEqual(num2words(7, ordinal=True, lang='de'), "siebte") self.assertEqual(num2words(8, ordinal=True, lang='de'), "achte") self.assertEqual(num2words(12, ordinal=True, lang='de'), "zwölfte") From df65296a80140ab645a251e8ab6f04cefeb04ca9 Mon Sep 17 00:00:00 2001 From: Zeno Gantner Date: Sun, 13 Jan 2019 23:18:51 +0100 Subject: [PATCH 2/5] German: similar rule for million as for 100 and 1000; 2 more ordinal tests --- num2words/lang_DE.py | 2 ++ tests/test_de.py | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/num2words/lang_DE.py b/num2words/lang_DE.py index f681697..23c6f68 100644 --- a/num2words/lang_DE.py +++ b/num2words/lang_DE.py @@ -118,6 +118,8 @@ class Num2Word_DE(Num2Word_EU): # Exception: "hundertste" is usually preferred over "einhundertste" if res == "eintausendste" or res == "einhundertste": res = res.replace("ein", "", 1) + if res == "eine millionste": + res = res.replace("eine ", "", 1) return res diff --git a/tests/test_de.py b/tests/test_de.py index 2715e7f..3b451af 100644 --- a/tests/test_de.py +++ b/tests/test_de.py @@ -47,6 +47,9 @@ class Num2WordsDETest(TestCase): self.assertEqual( num2words(4000, ordinal=True, lang='de'), "viertausendste" ) + self.assertEqual( + num2words(1000000, ordinal=True, lang='de'), "millionste" + ) self.assertEqual( num2words(2000000, ordinal=True, lang='de'), "zwei millionste" ) @@ -57,6 +60,7 @@ class Num2WordsDETest(TestCase): def test_cardinal_at_some_numbers(self): self.assertEqual(num2words(100, lang='de'), "einhundert") + self.assertEqual(num2words(1000000, lang='de'), "eine million") self.assertEqual(num2words(2000000, lang='de'), "zwei millionen") self.assertEqual(num2words(4000000000, lang='de'), "vier milliarden") self.assertEqual(num2words(1000000000, lang='de'), "eine milliarde") From e321caf392ac9c61b89301c33926068deb046ff5 Mon Sep 17 00:00:00 2001 From: Zeno Gantner Date: Sun, 13 Jan 2019 23:25:54 +0100 Subject: [PATCH 3/5] Million etc. are upper case in German --- num2words/lang_DE.py | 4 ++-- tests/test_de.py | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/num2words/lang_DE.py b/num2words/lang_DE.py index 23c6f68..ced8312 100644 --- a/num2words/lang_DE.py +++ b/num2words/lang_DE.py @@ -45,7 +45,7 @@ class Num2Word_DE(Num2Word_EU): self.errmsg_toobig = "Die Zahl %s muss kleiner als %s sein." self.exclude_title = [] - lows = ["non", "okt", "sept", "sext", "quint", "quadr", "tr", "b", "m"] + lows = ["Non", "Okt", "Sept", "Sext", "Quint", "Quadr", "Tr", "B", "M"] units = ["", "un", "duo", "tre", "quattuor", "quin", "sex", "sept", "okto", "novem"] tens = ["dez", "vigint", "trigint", "quadragint", "quinquagint", @@ -118,7 +118,7 @@ class Num2Word_DE(Num2Word_EU): # Exception: "hundertste" is usually preferred over "einhundertste" if res == "eintausendste" or res == "einhundertste": res = res.replace("ein", "", 1) - if res == "eine millionste": + if res == "eine Millionste": res = res.replace("eine ", "", 1) return res diff --git a/tests/test_de.py b/tests/test_de.py index 3b451af..f8ab13e 100644 --- a/tests/test_de.py +++ b/tests/test_de.py @@ -48,22 +48,22 @@ class Num2WordsDETest(TestCase): num2words(4000, ordinal=True, lang='de'), "viertausendste" ) self.assertEqual( - num2words(1000000, ordinal=True, lang='de'), "millionste" + num2words(1000000, ordinal=True, lang='de'), "Millionste" ) self.assertEqual( - num2words(2000000, ordinal=True, lang='de'), "zwei millionste" + num2words(2000000, ordinal=True, lang='de'), "zwei Millionste" ) self.assertEqual( num2words(5000000000, ordinal=True, lang='de'), - "fünf milliardste" + "fünf Milliardste" ) def test_cardinal_at_some_numbers(self): self.assertEqual(num2words(100, lang='de'), "einhundert") - self.assertEqual(num2words(1000000, lang='de'), "eine million") - self.assertEqual(num2words(2000000, lang='de'), "zwei millionen") - self.assertEqual(num2words(4000000000, lang='de'), "vier milliarden") - self.assertEqual(num2words(1000000000, lang='de'), "eine milliarde") + self.assertEqual(num2words(1000000, lang='de'), "eine Million") + self.assertEqual(num2words(2000000, lang='de'), "zwei Millionen") + self.assertEqual(num2words(4000000000, lang='de'), "vier Milliarden") + self.assertEqual(num2words(1000000000, lang='de'), "eine Milliarde") def test_cardinal_for_decimal_number(self): self.assertEqual( @@ -73,8 +73,8 @@ class Num2WordsDETest(TestCase): def test_giant_cardinal_for_merge(self): self.assertEqual( num2words(4500072900000111, lang='de'), - "vier billiarden fünfhundert billionen " + - "zweiundsiebzig milliarden neunhundert millionen einhundertelf" + "vier Billiarden fünfhundert Billionen " + + "zweiundsiebzig Milliarden neunhundert Millionen einhundertelf" ) def test_ordinal_num(self): From b71facf3ea377ed8bdc1278ea010f3af05f3dd2c Mon Sep 17 00:00:00 2001 From: Zeno Gantner Date: Sun, 13 Jan 2019 23:55:34 +0100 Subject: [PATCH 4/5] German: ordinals involving 'Million' etc. are written without space, and lower case --- num2words/lang_DE.py | 13 ++++++++++--- tests/test_de.py | 9 ++++++--- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/num2words/lang_DE.py b/num2words/lang_DE.py index ced8312..348b44f 100644 --- a/num2words/lang_DE.py +++ b/num2words/lang_DE.py @@ -17,6 +17,8 @@ from __future__ import print_function, unicode_literals +import re + from .lang_EU import Num2Word_EU @@ -107,7 +109,7 @@ class Num2Word_DE(Num2Word_EU): def to_ordinal(self, value): self.verify_ordinal(value) - outword = self.to_cardinal(value) + outword = self.to_cardinal(value).lower() for key in self.ords: if outword.endswith(key): outword = outword[:len(outword) - len(key)] + self.ords[key] @@ -118,8 +120,13 @@ class Num2Word_DE(Num2Word_EU): # Exception: "hundertste" is usually preferred over "einhundertste" if res == "eintausendste" or res == "einhundertste": res = res.replace("ein", "", 1) - if res == "eine Millionste": - res = res.replace("eine ", "", 1) + # ... similarly for "millionste" etc. + res = re.sub(r'eine ([a-z]+(illion|illiard)ste)$', + lambda m: m.group(1), res) + # Ordinals involving "Million" etc. are written without a space. + # see https://de.wikipedia.org/wiki/Million#Sprachliches + res = re.sub(r' ([a-z]+(illion|illiard)ste)$', + lambda m: m.group(1), res) return res diff --git a/tests/test_de.py b/tests/test_de.py index f8ab13e..7635cfb 100644 --- a/tests/test_de.py +++ b/tests/test_de.py @@ -48,14 +48,17 @@ class Num2WordsDETest(TestCase): num2words(4000, ordinal=True, lang='de'), "viertausendste" ) self.assertEqual( - num2words(1000000, ordinal=True, lang='de'), "Millionste" + num2words(1000000, ordinal=True, lang='de'), "millionste" ) self.assertEqual( - num2words(2000000, ordinal=True, lang='de'), "zwei Millionste" + num2words(2000000, ordinal=True, lang='de'), "zweimillionste" + ) + self.assertEqual( + num2words(1000000000, ordinal=True, lang='de'), "milliardste" ) self.assertEqual( num2words(5000000000, ordinal=True, lang='de'), - "fünf Milliardste" + "fünfmilliardste" ) def test_cardinal_at_some_numbers(self): From 67d58e708131cb12de2d2f1df46d614696123342 Mon Sep 17 00:00:00 2001 From: Zeno Gantner Date: Sun, 13 Jan 2019 23:57:57 +0100 Subject: [PATCH 5/5] German: add 3 more test cases for thousands --- tests/test_de.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/test_de.py b/tests/test_de.py index 7635cfb..2e50e5c 100644 --- a/tests/test_de.py +++ b/tests/test_de.py @@ -63,6 +63,9 @@ class Num2WordsDETest(TestCase): def test_cardinal_at_some_numbers(self): self.assertEqual(num2words(100, lang='de'), "einhundert") + self.assertEqual(num2words(1000, lang='de'), "eintausend") + self.assertEqual(num2words(5000, lang='de'), "fünftausend") + self.assertEqual(num2words(10000, lang='de'), "zehntausend") self.assertEqual(num2words(1000000, lang='de'), "eine Million") self.assertEqual(num2words(2000000, lang='de'), "zwei Millionen") self.assertEqual(num2words(4000000000, lang='de'), "vier Milliarden")