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')