Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding Language Support for Telugu / Bug Fix in Kannada #263

Merged
merged 9 commits into from
Dec 31, 2019
5 changes: 3 additions & 2 deletions num2words/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
lang_FR_BE, lang_FR_CH, lang_FR_DZ, lang_HE, lang_ID, lang_IT,
lang_JA, lang_KN, lang_KO, lang_LT, lang_LV, lang_NL, lang_NO,
lang_PL, lang_PT, lang_PT_BR, lang_RO, lang_RU, lang_SL,
lang_SR, lang_TH, lang_TR, lang_UK, lang_VI)
lang_SR, lang_TE, lang_TH, lang_TR, lang_UK, lang_VI)

CONVERTER_CLASSES = {
'ar': lang_AR.Num2Word_AR(),
Expand Down Expand Up @@ -60,7 +60,8 @@
'th': lang_TH.Num2Word_TH(),
'tr': lang_TR.Num2Word_TR(),
'nl': lang_NL.Num2Word_NL(),
'uk': lang_UK.Num2Word_UK()
'uk': lang_UK.Num2Word_UK(),
'te': lang_TE.Num2Word_TE()
}


Expand Down
6 changes: 3 additions & 3 deletions num2words/lang_KN.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@

from __future__ import unicode_literals

from .base import Num2Word_Base
from .lang_EU import Num2Word_EU


class Num2Word_KN(Num2Word_Base):
class Num2Word_KN(Num2Word_EU):
def set_high_numwords(self, high):
for n, word in self.high_numwords:
self.cards[10 ** n] = word
self.cards[10**n] = word

def setup(self):
self.low_numwords = [
Expand Down
169 changes: 169 additions & 0 deletions num2words/lang_TE.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
# -*- coding: utf-8 -*-

from __future__ import unicode_literals

from .lang_EU import Num2Word_EU


class Num2Word_TE(Num2Word_EU):
def set_high_numwords(self, high):
for n, word in self.high_numwords:
self.cards[10**n] = word

def setup(self):
self.low_numwords = [
"తొంభై తొమ్మిది",
"తొంభై ఎనిమిది",
"తొంభై ఏడు",
"తొంభై ఆరు",
"తొంభై అయిదు",
"తొంభై నాలుగు",
"తొంభై మూడు",
"తొంభై రెండు",
"తొంభై ఒకటి",
"తొంభై",
"ఎనభై తొమ్మిది",
"ఎనభై ఎనిమిది",
"ఎనభై ఏడు",
"ఎనభై ఆరు",
"ఎనభై అయిదు",
"ఎనభై నాలుగు",
"ఎనభై మూడు",
"ఎనభై రెండు",
"ఎనభై ఒకటి",
"ఎనభై",
"డెబ్బై తొమ్మిది",
"డెబ్బై ఎనిమిది",
"డెబ్బై ఏడు",
"డెబ్బై ఆరు",
"డెబ్బై అయిదు",
"డెబ్బై నాలుగు",
"డెబ్బై మూడు",
"డెబ్బై రెండు",
"డెబ్బై ఒకటి",
"డెబ్బై",
"అరవై తొమ్మిది",
"అరవై ఎనిమిది",
"అరవై ఏడు",
"అరవై ఆరు",
"అరవై అయిదు",
"అరవై నాలుగు",
"అరవై మూడు",
"అరవై రెండు",
"అరవై ఒకటి",
"అరవై",
"యాభై తొమ్మిది",
"యాభై ఎనిమిది",
"యాభై ఏడు",
"యాభై ఆరు",
"యాభై అయిదు",
"యాభై నాలుగు",
"యాభై మూడు",
"యాభై రెండు",
"యాభై ఒకటి",
"యాభై ",
"నలభై తొమ్మిది",
"నలభై ఎనిమిది",
"నలభై ఏడు",
"నలభై ఆరు",
"నలభై అయిదు",
"నలభై నాలుగు",
"నలభై మూడు",
"నలభై రెండు",
"నలభై ఒకటి",
"నలభై",
"ముప్పై తొమ్మిది",
"ముప్పై ఎనిమిది",
"ముప్పై ఏడు",
"ముప్పై ఆరు",
"ముప్పై ఐదు",
"ముప్పై నాలుగు",
"ముప్పై మూడు",
"ముప్పై రెండు",
"ముప్పై ఒకటి",
"ముప్పై",
"ఇరవై తొమ్మిది",
"ఇరవై ఎనిమిది",
"ఇరవై ఏడు",
"ఇరవై ఆరు",
"ఇరవై అయిదు",
"ఇరవై నాలుగు",
"ఇరవై మూడు",
"ఇరవై రెండు",
"ఇరవై ఒకటి",
"ఇరవై",
"పందొమ్మిది",
"పధ్ధెనిమిది",
"పదిహేడు",
"పదహారు",
"పదునయిదు",
"పధ్నాలుగు",
"పదమూడు",
"పన్నెండు",
"పదకొండు",
"పది",
"తొమ్మిది",
"ఎనిమిది",
"ఏడు",
"ఆరు",
"అయిదు",
"నాలుగు",
"మూడు",
"రెండు",
"ఒకటి",
"సున్న",
]

self.mid_numwords = [(100, "వంద")]

self.high_numwords = [(7, "కోట్ల"), (5, "లక్ష"), (3, "వేయి")]

self.pointword = "బిందువు "

self.modifiers = [
" ్ ",
"ా ",
" ి ",
" ీ ",
" ు ",
" ూ ",
" ృ ",
" ౄ ",
" ె ",
" ే ",
" ై ",
" ొ",
" ో ",
" ౌ ",
" ఁ ",
" ం ",
" ః ",
]

def merge(self, lpair, rpair):
ltext, lnum = lpair
rtext, rnum = rpair
if lnum == 1 and rnum < 100:
return (rtext, rnum)
elif 100 > lnum > rnum:
return ("%s-%s" % (ltext, rtext), lnum + rnum)
elif lnum >= 100 > rnum:
if ltext[-1] in self.modifiers:
return ("%s %s" % (ltext[:-1], rtext), lnum + rnum)
else:
return ("%s %s" % (ltext+"ల", rtext), lnum + rnum)
elif rnum > lnum:
return ("%s %s" % (ltext, rtext), lnum * rnum)
return ("%s %s" % (ltext, rtext), lnum + rnum)

def to_ordinal_num(self, value):
self.verify_ordinal(value)
return "%s%s" % (value, self.to_ordinal(value)[-1:])

def to_ordinal(self, value):
self.verify_ordinal(value)
outwords = self.to_cardinal(value)
if outwords[-1] in self.modifiers:
outwords = outwords[:-1]
ordinal_num = outwords + "వ"
return ordinal_num
10 changes: 8 additions & 2 deletions tests/test_kn.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,16 @@ def test_ordinal(self):
num2words(1003, lang='kn', to='ordinal'),
u'ಒಂದು ಸಾವಿರದ ಮೂರನೇ'
)

def test_ordinal_num(self):
self.assertEqual(num2words(2, lang="kn", ordinal=True), u"ಎರಡನೇ")
self.assertEqual(num2words(5, lang="kn", ordinal=True), u"ಐದನೇ")
self.assertEqual(num2words(16, lang="kn", ordinal=True), u"ಹದಿನಾರನೇ")
self.assertEqual(num2words(113, lang="kn", ordinal=True),
u"ಒಂದು ನೂರ ಹದಿಮೂರನೇ")

def test_ordinal_num(self):
self.assertEqual(num2words(2, lang="kn", to='ordinal_num'), u"2ಎರಡನೇ")
self.assertEqual(num2words(5, lang="kn", to='ordinal_num'), u"5ಐದನೇ")
self.assertEqual(num2words(16, lang="kn", to='ordinal_num'),
u"16ಹದಿನಾರನೇ")
self.assertEqual(num2words(113, lang="kn", to='ordinal_num'),
u"113ಒಂದು ನೂರ ಹದಿಮೂರನೇ")
70 changes: 70 additions & 0 deletions tests/test_te.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# -*- 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 unittest import TestCase

from num2words import num2words


class Num2WordsTETest(TestCase):
def test_numbers(self):
self.assertEqual(num2words(66, lang="te"), u"అరవై ఆరు")
self.assertEqual(num2words(1734, lang="te"),
u"ఒకటి వేయి ఏడు వందల ముప్పై నాలుగు")
self.assertEqual(num2words(134, lang="te"),
u"ఒకటి వందల ముప్పై నాలుగు")
self.assertEqual(num2words(54411, lang="te"),
u"యాభై నాలుగు వేయి నాలుగు వందల పదకొండు")
self.assertEqual(num2words(42, lang="te"), u"నలభై రెండు")
self.assertEqual(num2words(893, lang="te"),
u"ఎనిమిది వందల తొంభై మూడు")
self.assertEqual(
num2words(1729, lang="te"), u"ఒకటి వేయి ఏడు వందల ఇరవై తొమ్మిది"
)
self.assertEqual(num2words(123, lang="te"), u"ఒకటి వందల ఇరవై మూడు")
self.assertEqual(num2words(32211, lang="te"),
u"ముప్పై రెండు వేయి రెండు వందల పదకొండు")

def test_cardinal_for_float_number(self):
self.assertEqual(num2words(1.61803, lang="te"),
u"ఒకటి బిందువు ఆరు ఒకటి ఎనిమిది సున్న మూడు")
self.assertEqual(num2words(34.876, lang="te"),
u"ముప్పై నాలుగు బిందువు ఎనిమిది ఏడు ఆరు")
self.assertEqual(num2words(3.14, lang="te"),
u"మూడు బిందువు ఒకటి నాలుగు")

def test_ordinal(self):
self.assertEqual(num2words(1, lang='te', to='ordinal'), u"ఒకటివ")
self.assertEqual(num2words(22, lang='te', to='ordinal'),
u"ఇరవై రెండువ")
self.assertEqual(num2words(23, lang='te', to='ordinal'),
u"ఇరవై మూడువ")
self.assertEqual(num2words(12, lang='te', to='ordinal'), u"పన్నెండువ")
self.assertEqual(num2words(130, lang='te', to='ordinal'),
u"ఒకటి వందల ముప్పైవ")
self.assertEqual(num2words(1003, lang='te', to='ordinal'),
u"ఒకటి వేయిల మూడువ")
self.assertEqual(num2words(4, lang='te', to='ordinal'),
u"నాలుగువ")

def test_ordinal_num(self):
self.assertEqual(num2words(2, lang="te", to='ordinal_num'), u"2వ")
self.assertEqual(num2words(3, lang="te", to='ordinal_num'), u"3వ")
self.assertEqual(num2words(5, lang="te", to='ordinal_num'), u"5వ")
self.assertEqual(num2words(16, lang="te", to='ordinal_num'), u"16వ")
self.assertEqual(num2words(113, lang="te", to='ordinal_num'),
u"113వ")