From fdeb061ecadd75e10b836bb61dbcaa364eac3e8b Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Mon, 6 Apr 2015 15:06:17 -0400 Subject: [PATCH] Fix 5 and 9 ordinals in french fixes #18 --- num2words/lang_FR.py | 18 +++++++++++++----- tests/test_fr.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 tests/test_fr.py diff --git a/num2words/lang_FR.py b/num2words/lang_FR.py index 39b0e8b..ce2773a 100644 --- a/num2words/lang_FR.py +++ b/num2words/lang_FR.py @@ -19,7 +19,6 @@ from __future__ import unicode_literals from .lang_EU import Num2Word_EU #//TODO: error messages in French -#//TODO: ords class Num2Word_FR(Num2Word_EU): def setup(self): self.negword = "moins " @@ -35,6 +34,10 @@ class Num2Word_FR(Num2Word_EU): "seize", "quinze", "quatorze", "treize", "douze", "onze", "dix", "neuf", "huit", "sept", "six", "cinq", "quatre", "trois", "deux", "un", "zéro"] + self.ords = { + "cinq": "cinquième", + "neuf": "neuvième", + } def merge(self, curr, next): @@ -67,10 +70,15 @@ class Num2Word_FR(Num2Word_EU): if value == 1: return "premier" word = self.to_cardinal(value) - if word[-1] == "e": - word = word[:-1] - return word + "ième" - + for src, repl in self.ords.items(): + if word.endswith(src): + word = word[:-len(src)] + repl + break + else: + if word[-1] == "e": + word = word[:-1] + word = word + "ième" + return word def to_ordinal_num(self, value): self.verify_ordinal(value) diff --git a/tests/test_fr.py b/tests/test_fr.py new file mode 100644 index 0000000..17d90f1 --- /dev/null +++ b/tests/test_fr.py @@ -0,0 +1,30 @@ +# -*- encoding: utf-8 -*- +# Copyright (c) 2015, 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 Num2WordsENTest(TestCase): + def test_ordinal_special_joins(self): + # ref https://github.com/savoirfairelinux/num2words/issues/18 + self.assertEqual(num2words(5, ordinal=True, lang='fr'), "cinquième") + self.assertEqual(num2words(35, ordinal=True, lang='fr'), "trente-cinquième") + self.assertEqual(num2words(9, ordinal=True, lang='fr'), "neuvième") + self.assertEqual(num2words(49, ordinal=True, lang='fr'), "quarante-neuvième") +