From 7cd31a93f13a49a26cb4ab44173ec38d0218456f Mon Sep 17 00:00:00 2001 From: btharper Date: Sat, 26 Oct 2019 16:37:22 -0400 Subject: [PATCH 1/4] Add simple tests for lang_DK.py --- tests/test_dk.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 tests/test_dk.py diff --git a/tests/test_dk.py b/tests/test_dk.py new file mode 100644 index 0000000..889e9d8 --- /dev/null +++ b/tests/test_dk.py @@ -0,0 +1,37 @@ +# coding: utf-8 +# Copyright (c) 2003, Taro Ogawa. All Rights Reserved. +# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. + +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301 USA + +from __future__ import unicode_literals + +from unittest import TestCase + +from num2words import num2words + + +class Num2WordsDKTest(TestCase): + def test_ordinal(self): + self.assertEqual(num2words(1, to="ordinal", lang="dk"), "første") + self.assertEqual(num2words(5, to="ordinal", lang="dk"), "femte") + + def test_cardinal(self): + self.assertEqual(num2words(0, to="cardinal", lang="dk"), "nul") + self.assertEqual(num2words(1, to="cardinal", lang="dk"), "et") + self.assertEqual(num2words(2, to="cardinal", lang="dk"), "to") + self.assertEqual(num2words(5, to="cardinal", lang="dk"), "fem") + self.assertEqual(num2words(8, to="cardinal", lang="dk"), "otte") + self.assertEqual(num2words(18, to="cardinal", lang="dk"), "atten") + self.assertEqual(num2words(45, to="cardinal", lang="dk"), "femogfyrre") From d82f739bc9cb87f9c5e79facba86a26b83c29266 Mon Sep 17 00:00:00 2001 From: btharper Date: Sat, 26 Oct 2019 17:37:47 -0400 Subject: [PATCH 2/4] Add ordinal 12,345 to ES test suite to increase coverage --- tests/test_es.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_es.py b/tests/test_es.py index a49cfbf..7e99cfc 100644 --- a/tests/test_es.py +++ b/tests/test_es.py @@ -95,6 +95,7 @@ TEST_CASES_ORDINAL = ( (28, 'vigésimo octavo'), (100, 'centésimo'), (1000, 'milésimo'), + (12345, 'doce mil trescientos cuarenta y cinco'), (1000000, 'millonésimo'), (1000000000000000, 'cuadrillonésimo'), (1000000000000000000, 'un trillón') # over 1e18 is not supported From 6819f5a6ed4dce1b148b231c423bc827b6f1c3f4 Mon Sep 17 00:00:00 2001 From: btharper Date: Sat, 26 Oct 2019 22:38:50 -0400 Subject: [PATCH 3/4] Fix py2/3 difference on division and update test case --- num2words/lang_ES.py | 16 ++++++++++++---- tests/test_es.py | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/num2words/lang_ES.py b/num2words/lang_ES.py index fca9491..7d6e46b 100644 --- a/num2words/lang_ES.py +++ b/num2words/lang_ES.py @@ -17,6 +17,8 @@ from __future__ import print_function, unicode_literals +import math + from .lang_EU import Num2Word_EU @@ -143,25 +145,31 @@ class Num2Word_ES(Num2Word_EU): self.to_ordinal(value - cen)) ) elif value < 1e18: + # Round down to the nearest 1e(3n) # dec contains the following: # [ 1e3, 1e6): 1e3 # [ 1e6, 1e9): 1e6 # [ 1e9, 1e12): 1e9 # [1e12, 1e15): 1e12 # [1e15, 1e18): 1e15 - dec = 10 ** ((((len(str(int(value))) - 1) / 3 - 1) + 1) * 3) - part = int(float(value / dec) * dec) + dec = 1000 ** int(math.log(int(value), 1000)) + + # Split the parts before and after the word for 'dec' + # eg (12, 345) = divmod(12_345, 1_000) + high_part, low_part = divmod(value, dec) + cardinal = ( - self.to_cardinal(part / dec) if part / dec != 1 else "" + self.to_cardinal(high_part) if high_part != 1 else "" ) text = ( "%s%s%s %s" % (cardinal, self.ords[dec], self.gender_stem, - self.to_ordinal(value - part)) + self.to_ordinal(low_part)) ) else: text = self.to_cardinal(value) except KeyError: text = self.to_cardinal(value) + raise return text.strip() def to_ordinal_num(self, value): diff --git a/tests/test_es.py b/tests/test_es.py index 7e99cfc..d306981 100644 --- a/tests/test_es.py +++ b/tests/test_es.py @@ -95,7 +95,7 @@ TEST_CASES_ORDINAL = ( (28, 'vigésimo octavo'), (100, 'centésimo'), (1000, 'milésimo'), - (12345, 'doce mil trescientos cuarenta y cinco'), + (12345, 'docemilésimo tricentésimo quadragésimo quinto'), (1000000, 'millonésimo'), (1000000000000000, 'cuadrillonésimo'), (1000000000000000000, 'un trillón') # over 1e18 is not supported From d161b4348d0545b3745929102c65fd12a41f082a Mon Sep 17 00:00:00 2001 From: btharper Date: Sat, 26 Oct 2019 23:22:23 -0400 Subject: [PATCH 4/4] Remove excess try/except KeyError block --- num2words/lang_ES.py | 88 +++++++++++++++++++++----------------------- 1 file changed, 41 insertions(+), 47 deletions(-) diff --git a/num2words/lang_ES.py b/num2words/lang_ES.py index 7d6e46b..a8cc47d 100644 --- a/num2words/lang_ES.py +++ b/num2words/lang_ES.py @@ -15,7 +15,7 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301 USA -from __future__ import print_function, unicode_literals +from __future__ import division, print_function, unicode_literals import math @@ -122,54 +122,48 @@ class Num2Word_ES(Num2Word_EU): def to_ordinal(self, value): self.verify_ordinal(value) - try: - if value == 0: - text = "" - elif value <= 10: - text = "%s%s" % (self.ords[value], self.gender_stem) - elif value <= 12: - text = ( - "%s%s%s" % (self.ords[10], self.gender_stem, - self.to_ordinal(value - 10)) - ) - elif value <= 100: - dec = (value // 10) * 10 - text = ( - "%s%s %s" % (self.ords[dec], self.gender_stem, - self.to_ordinal(value - dec)) - ) - elif value <= 1e3: - cen = (value // 100) * 100 - text = ( - "%s%s %s" % (self.ords[cen], self.gender_stem, - self.to_ordinal(value - cen)) - ) - elif value < 1e18: - # Round down to the nearest 1e(3n) - # dec contains the following: - # [ 1e3, 1e6): 1e3 - # [ 1e6, 1e9): 1e6 - # [ 1e9, 1e12): 1e9 - # [1e12, 1e15): 1e12 - # [1e15, 1e18): 1e15 - dec = 1000 ** int(math.log(int(value), 1000)) - - # Split the parts before and after the word for 'dec' - # eg (12, 345) = divmod(12_345, 1_000) - high_part, low_part = divmod(value, dec) - - cardinal = ( - self.to_cardinal(high_part) if high_part != 1 else "" + if value == 0: + text = "" + elif value <= 10: + text = "%s%s" % (self.ords[value], self.gender_stem) + elif value <= 12: + text = ( + "%s%s%s" % (self.ords[10], self.gender_stem, + self.to_ordinal(value - 10)) ) - text = ( - "%s%s%s %s" % (cardinal, self.ords[dec], self.gender_stem, - self.to_ordinal(low_part)) - ) - else: - text = self.to_cardinal(value) - except KeyError: + elif value <= 100: + dec = (value // 10) * 10 + text = ( + "%s%s %s" % (self.ords[dec], self.gender_stem, + self.to_ordinal(value - dec)) + ) + elif value <= 1e3: + cen = (value // 100) * 100 + text = ( + "%s%s %s" % (self.ords[cen], self.gender_stem, + self.to_ordinal(value - cen)) + ) + elif value < 1e18: + # Round down to the nearest 1e(3n) + # dec contains the following: + # [ 1e3, 1e6): 1e3 + # [ 1e6, 1e9): 1e6 + # [ 1e9, 1e12): 1e9 + # [1e12, 1e15): 1e12 + # [1e15, 1e18): 1e15 + dec = 1000 ** int(math.log(int(value), 1000)) + + # Split the parts before and after the word for 'dec' + # eg (12, 345) = divmod(12_345, 1_000) + high_part, low_part = divmod(value, dec) + + cardinal = self.to_cardinal(high_part) if high_part != 1 else "" + text = ( + "%s%s%s %s" % (cardinal, self.ords[dec], self.gender_stem, + self.to_ordinal(low_part)) + ) + else: text = self.to_cardinal(value) - raise return text.strip() def to_ordinal_num(self, value):