German: ordinals involving 'Million' etc. are written without space, and lower case

This commit is contained in:
Zeno Gantner
2019-01-13 23:55:34 +01:00
parent e321caf392
commit b71facf3ea
2 changed files with 16 additions and 6 deletions

View File

@@ -17,6 +17,8 @@
from __future__ import print_function, unicode_literals from __future__ import print_function, unicode_literals
import re
from .lang_EU import Num2Word_EU from .lang_EU import Num2Word_EU
@@ -107,7 +109,7 @@ class Num2Word_DE(Num2Word_EU):
def to_ordinal(self, value): def to_ordinal(self, value):
self.verify_ordinal(value) self.verify_ordinal(value)
outword = self.to_cardinal(value) outword = self.to_cardinal(value).lower()
for key in self.ords: for key in self.ords:
if outword.endswith(key): if outword.endswith(key):
outword = outword[:len(outword) - len(key)] + self.ords[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" # Exception: "hundertste" is usually preferred over "einhundertste"
if res == "eintausendste" or res == "einhundertste": if res == "eintausendste" or res == "einhundertste":
res = res.replace("ein", "", 1) res = res.replace("ein", "", 1)
if res == "eine Millionste": # ... similarly for "millionste" etc.
res = res.replace("eine ", "", 1) 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 return res

View File

@@ -48,14 +48,17 @@ class Num2WordsDETest(TestCase):
num2words(4000, ordinal=True, lang='de'), "viertausendste" num2words(4000, ordinal=True, lang='de'), "viertausendste"
) )
self.assertEqual( self.assertEqual(
num2words(1000000, ordinal=True, lang='de'), "Millionste" num2words(1000000, ordinal=True, lang='de'), "millionste"
) )
self.assertEqual( 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( self.assertEqual(
num2words(5000000000, ordinal=True, lang='de'), num2words(5000000000, ordinal=True, lang='de'),
"fünf Milliardste" "fünfmilliardste"
) )
def test_cardinal_at_some_numbers(self): def test_cardinal_at_some_numbers(self):