From 1a2b783d31667db52a27e498475d366b8553c733 Mon Sep 17 00:00:00 2001 From: Antonio Gurgel <5069658+Goorzhel@users.noreply.github.com> Date: Mon, 18 Dec 2017 07:56:38 -0800 Subject: [PATCH] lang_EN.to_year(): render correct pronunciations (#144) * Add tests Starting work on #141, which points out that 2017 should come out "twenty seventeen"; it currently comes out "two thousand seventeen". * Handle English years properly. Resolves #141. * Whoops -- didn't PEP-8 my tests * Handle years MORE properly...with suffixes! - Rendering years between 10-99 was bugged (e.g. "zero fifty"). Fixed that by thinking outside the high/low text box I had made. - Added suffixes: default none if positive, 'BC' if negative. User-overrideable. --- num2words/lang_EN.py | 26 +++++++++++++++++++----- tests/test_en.py | 48 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 5 deletions(-) diff --git a/num2words/lang_EN.py b/num2words/lang_EN.py index 4c4fb07..d589254 100644 --- a/num2words/lang_EN.py +++ b/num2words/lang_EN.py @@ -82,8 +82,24 @@ class Num2Word_EN(lang_EU.Num2Word_EU): self.verify_ordinal(value) return "%s%s" % (value, self.to_ordinal(value)[-2:]) - def to_year(self, val, longval=True): - if not (val // 100) % 10: - return self.to_cardinal(val) - return self.to_splitnum(val, hightxt="hundred", jointxt="and", - longval=longval) + def to_year(self, val, suffix=None, longval=True): + if val < 0: + val = abs(val) + suffix = 'BC' if not suffix else suffix + high, low = (val // 100, val % 100) + # If year is 00XX, X00X, or beyond 9999, go cardinal. + if (high == 0 + or (high % 10 == 0 and low < 10) + or high >= 100): + valtext = self.to_cardinal(val) + else: + hightext = self.to_cardinal(high) + if low == 0: + lowtext = "hundred" + elif low < 10: + lowtext = "oh-%s" % self.to_cardinal(low) + else: + lowtext = self.to_cardinal(low) + valtext = "%s %s" % (hightext, lowtext) + return (valtext if not suffix + else "%s %s" % (valtext, suffix)) diff --git a/tests/test_en.py b/tests/test_en.py index 5016eef..2aae58e 100644 --- a/tests/test_en.py +++ b/tests/test_en.py @@ -59,3 +59,51 @@ class Num2WordsENTest(TestCase): cents=True, currency='USD'), 'four thousand, seven hundred and seventy-eight dollars and' ' zero cents') + + def test_to_year(self): + # issue 141 + # "e2 e2" + self.assertEqual(num2words(1990, lang='en', to='year'), + 'nineteen ninety') + self.assertEqual(num2words(5555, lang='en', to='year'), + 'fifty-five fifty-five') + self.assertEqual(num2words(2017, lang='en', to='year'), + 'twenty seventeen') + self.assertEqual(num2words(1066, lang='en', to='year'), + 'ten sixty-six') + self.assertEqual(num2words(1865, lang='en', to='year'), + 'eighteen sixty-five') + # "e3 and e1"; "e2 oh-e1"; "e3" + self.assertEqual(num2words(3000, lang='en', to='year'), + 'three thousand') + self.assertEqual(num2words(2001, lang='en', to='year'), + 'two thousand and one') + self.assertEqual(num2words(1901, lang='en', to='year'), + 'nineteen oh-one') + self.assertEqual(num2words(2000, lang='en', to='year'), + 'two thousand') + self.assertEqual(num2words(905, lang='en', to='year'), + 'nine oh-five') + # "e2 hundred"; "e3" + self.assertEqual(num2words(6600, lang='en', to='year'), + 'sixty-six hundred') + self.assertEqual(num2words(1900, lang='en', to='year'), + 'nineteen hundred') + self.assertEqual(num2words(600, lang='en', to='year'), + 'six hundred') + self.assertEqual(num2words(50, lang='en', to='year'), + 'fifty') + self.assertEqual(num2words(0, lang='en', to='year'), + 'zero') + # suffixes + self.assertEqual(num2words(-44, lang='en', to='year'), + 'forty-four BC') + self.assertEqual(num2words(-44, lang='en', to='year', suffix='BCE'), + 'forty-four BCE') + self.assertEqual(num2words(1, lang='en', to='year', suffix='AD'), + 'one AD') + self.assertEqual(num2words(66, lang='en', to='year', + suffix='m.y.a.'), + 'sixty-six m.y.a.') + self.assertEqual(num2words(-66000000, lang='en', to='year'), + 'sixty-six million BC')