Skip to content

Commit cbfc8fd

Browse files
akki2825erozqba
authored andcommitted
add kannada language support (#243)
* add kannada support * add Kannada Language support * add tests for kannada * reformatted * change lang param * fix tests * add condition * add modifier * add few more test cases * fix test * fix test * modify test * fix flake8 * fix isort * add more tests * add unicode prefix * edit tests for float numbers * add more tests * add unicode prefix in tests * add Kannada language
1 parent f6dc5a3 commit cbfc8fd

File tree

4 files changed

+256
-3
lines changed

4 files changed

+256
-3
lines changed

README.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ Besides the numerical argument, there are two main optional arguments.
9595
* ``id`` (Indonesian)
9696
* ``it`` (Italian)
9797
* ``ja`` (Japanese)
98+
* ``kn`` (Kannada)
9899
* ``ko`` (Korean)
99100
* ``lt`` (Lithuanian)
100101
* ``lv`` (Latvian)

num2words/__init__.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@
2020
from . import (lang_AR, lang_CZ, lang_DE, lang_DK, lang_EN, lang_EN_IN,
2121
lang_ES, lang_ES_CO, lang_ES_VE, lang_FI, lang_FR, lang_FR_BE,
2222
lang_FR_CH, lang_FR_DZ, lang_HE, lang_ID, lang_IT, lang_JA,
23-
lang_KO, lang_LT, lang_LV, lang_NL, lang_NO, lang_PL, lang_PT,
24-
lang_PT_BR, lang_RO, lang_RU, lang_SL, lang_SR, lang_TH,
25-
lang_TR, lang_UK, lang_VI)
23+
lang_KN, lang_KO, lang_LT, lang_LV, lang_NL, lang_NO, lang_PL,
24+
lang_PT, lang_PT_BR, lang_RO, lang_RU, lang_SL, lang_SR,
25+
lang_TH, lang_TR, lang_UK, lang_VI)
2626

2727
CONVERTER_CLASSES = {
2828
'ar': lang_AR.Num2Word_AR(),
@@ -40,6 +40,7 @@
4040
'es_VE': lang_ES_VE.Num2Word_ES_VE(),
4141
'id': lang_ID.Num2Word_ID(),
4242
'ja': lang_JA.Num2Word_JA(),
43+
'kn': lang_KN.Num2Word_KN(),
4344
'ko': lang_KO.Num2Word_KO(),
4445
'lt': lang_LT.Num2Word_LT(),
4546
'lv': lang_LV.Num2Word_LV(),
@@ -73,8 +74,10 @@ def num2words(number, ordinal=False, lang='en', to='cardinal', **kwargs):
7374
if lang not in CONVERTER_CLASSES:
7475
raise NotImplementedError()
7576
converter = CONVERTER_CLASSES[lang]
77+
7678
if isinstance(number, str):
7779
number = converter.str_to_number(number)
80+
7881
# backwards compatible
7982
if ordinal:
8083
return converter.to_ordinal(number)

num2words/lang_KN.py

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
# -*- encoding: utf-8 -*-
2+
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
3+
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
4+
5+
# This library is free software; you can redistribute it and/or
6+
# modify it under the terms of the GNU Lesser General Public
7+
# License as published by the Free Software Foundation; either
8+
# version 2.1 of the License, or (at your option) any later version.
9+
# This library is distributed in the hope that it will be useful,
10+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12+
# Lesser General Public License for more details.
13+
# You should have received a copy of the GNU Lesser General Public
14+
# License along with this library; if not, write to the Free Software
15+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
16+
# MA 02110-1301 USA
17+
18+
from __future__ import unicode_literals
19+
20+
from .base import Num2Word_Base
21+
22+
23+
class Num2Word_KN(Num2Word_Base):
24+
def set_high_numwords(self, high):
25+
for n, word in self.high_numwords:
26+
self.cards[10 ** n] = word
27+
28+
def setup(self):
29+
self.low_numwords = [
30+
"ತೊಂಬತ್ತೊಂಬತ್ತು",
31+
"ತೊಂಬತ್ತೆಂಟು",
32+
"ತೊಂಬತ್ತೇಳು",
33+
"ತೊಂಬತ್ತಾರು",
34+
"ತೊಂಬತ್ತೈದು",
35+
"ತೊಂಬತ್ತ ನಾಲ್ಕು",
36+
"ತೊಂಬತ್ತ ಮೂರು",
37+
"ತೊಂಬತ್ತೆರಡು",
38+
"ತೊಂಬತ್ತೊಂದು",
39+
"ತೊಂಬತ್ತು",
40+
"ಎಂಬತ್ತೊಂಬತ್ತು",
41+
"ಎಂಬತ್ತೆಂಟು",
42+
"ಎಂಬತ್ತೇಳು",
43+
"ಎಂಬತ್ತಾರು",
44+
"ಎಂಬತ್ತೈದು",
45+
"ಎಂಬತ್ತ್ ನಾಲ್ಕು",
46+
"ಎಂಬತ್ತ್ ಮೂರು",
47+
"ಎಂಬತ್ತೆರಡು",
48+
"ಎಂಬತ್ತೊಂದು",
49+
"ಎಂಬತ್ತು",
50+
"ಎಪ್ಪತ್ತೊಂಬತ್ತು",
51+
"ಎಪ್ಪತ್ತೆಂಟು",
52+
"ಎಪ್ಪತ್ತೇಳು",
53+
"ಎಪ್ಪತ್ತಾರು",
54+
"ಎಪ್ಪತ್ತೈದು",
55+
"ಎಪ್ಪತ್ತ್ ನಾಲ್ಕು",
56+
"ಎಪ್ಪತ್ತ್ ಮೂರು",
57+
"ಎಪ್ಪತ್ತೆರಡು",
58+
"ಎಪ್ಪತ್ತೊಂದು",
59+
"ಎಪ್ಪತ್ತು",
60+
"ಅರವತ್ತೊಂಬತ್ತು",
61+
"ಅರವತ್ತೆಂಟು",
62+
"ಅರವತ್ತೇಳು",
63+
"ಅರವತ್ತಾರು",
64+
"ಅರವತ್ತೈದು",
65+
"ಅರವತ್ತ್ ನಾಲ್ಕು",
66+
"ಅರವತ್ತ್ ಮೂರು",
67+
"ಅರವತ್ತೆರಡು",
68+
"ಅರವತ್ತೊಂದು",
69+
"ಅರವತ್ತು",
70+
"ಐವತ್ತೊಂಬತ್ತು",
71+
"ಐವತ್ತೆಂಟು",
72+
"ಐವತ್ತೇಳು",
73+
"ಐವತ್ತಾರು",
74+
"ಐವತ್ತೈದು",
75+
"ಐವತ್ತ್ನಾಲ್ಕು",
76+
"ಐವತ್ತಮೂರು",
77+
"ಐವತ್ತೆರಡು",
78+
"ಐವತ್ತೊಂದು",
79+
"ಐವತ್ತು",
80+
"ನಲವತ್ತೊಂಬತ್ತು",
81+
"ನಲವತ್ತೆಂಟು",
82+
"ನಲವತ್ತೇಳು",
83+
"ನಲವತ್ತಾರು",
84+
"ನಲವತ್ತೈದು",
85+
"ನಲವತ್ತ್ ನಾಲ್ಕು",
86+
"ನಲವತ್ತ್ ಮೂರು",
87+
"ನಲವತ್ತ್ ಎರಡು",
88+
"ನಲವತ್ತೊಂದು",
89+
"ನಲವತ್ತು",
90+
"ಮೂವತ್ತ್ ಒಂಬತ್ತು",
91+
"ಮೂವತ್ಎಂಟು",
92+
"ಮೂವತ್ಏಳು",
93+
"ಮೂವತ್ಆರು",
94+
"ಮೂವತ್ತ್ ಐದು",
95+
"ಮೂವತ್ತ್ ನಾಲ್ಕು",
96+
"ಮೂವತ್ತ್ ಮೂರು",
97+
"ಮೂವತ್ತ್ಎರಡು",
98+
"ಮೂವತ್ತ್ಒಂದು",
99+
"ಮೂವತ್ತು",
100+
"ಇಪ್ಪತ್ತ್ಒಂಬತ್ತು",
101+
"ಇಪ್ಪತ್ತ್ಎಂಟು",
102+
"ಇಪ್ಪತ್ತ್ಏಳು",
103+
"ಇಪ್ಪತ್ತ್ಆರು",
104+
"ಇಪ್ಪತ್ತ್ ಐದು",
105+
"ಇಪ್ಪತ್ತ್ ನಾಲ್ಕು",
106+
"ಇಪ್ಪತ್ತ್ ಮೂರು",
107+
"ಇಪ್ಪತ್ತ್ ಎರಡು",
108+
"ಇಪ್ಪತ್ತ್ ಒಂದು",
109+
"ಇಪ್ಪತ್ತು",
110+
"ಹತ್ತೊಂಬತ್ತು",
111+
"ಹದಿನೆಂಟು",
112+
"ಹದಿನೇಳು",
113+
"ಹದಿನಾರು",
114+
"ಹದಿನೈದು",
115+
"ಹದಿನಾಲ್ಕು",
116+
"ಹದಿಮೂರು",
117+
"ಹನ್ನೆರಡು",
118+
"ಹನ್ನೊಂದು",
119+
"ಹತ್ತು",
120+
"ಒಂಬತ್ತು",
121+
"ಎಂಟು",
122+
"ಏಳು",
123+
"ಆರು",
124+
"ಐದು",
125+
"ನಾಲ್ಕು",
126+
"ಮೂರು",
127+
"ಎರಡು",
128+
"ಒಂದು",
129+
"ಸೊನ್ನೆ",
130+
]
131+
132+
self.mid_numwords = [(100, "ನೂರು")]
133+
134+
self.high_numwords = [(7, "ಕೋಟಿ"), (5, "ಒಂದು ಲಕ್ಷ"), (3, "ಸಾವಿರ")]
135+
136+
self.pointword = "ಬಿಂದು"
137+
138+
self.modifiers = [
139+
"್",
140+
"ಾ",
141+
"ಿ",
142+
"ೀ",
143+
"ೀ",
144+
"ು",
145+
"ೂ",
146+
"ೃ",
147+
"ೆ",
148+
"ೇ",
149+
"ೈ",
150+
"ೊ",
151+
"ೋ",
152+
"ೌ",
153+
"ೕ",
154+
]
155+
156+
def merge(self, lpair, rpair):
157+
ltext, lnum = lpair
158+
rtext, rnum = rpair
159+
if lnum == 1 and rnum < 100:
160+
return (rtext, rnum)
161+
elif 100 > lnum > rnum:
162+
return ("%s-%s" % (ltext, rtext), lnum + rnum)
163+
elif lnum >= 100 > rnum:
164+
if ltext[-1] in self.modifiers:
165+
return ("%s %s" % (ltext[:-1], rtext), lnum + rnum)
166+
else:
167+
return ("%s %s" % (ltext + "ದ", rtext), lnum + rnum)
168+
elif rnum > lnum:
169+
return ("%s %s" % (ltext, rtext), lnum * rnum)
170+
return ("%s %s" % (ltext, rtext), lnum + rnum)
171+
172+
def to_ordinal_num(self, value):
173+
self.verify_ordinal(value)
174+
return "%s%s" % (value, self.to_ordinal(value))
175+
176+
def to_ordinal(self, value):
177+
self.verify_ordinal(value)
178+
outwords = self.to_cardinal(value)
179+
if outwords[-1] in self.modifiers:
180+
outwords = outwords[:-1]
181+
ordinal_num = outwords + "ನೇ"
182+
return ordinal_num

tests/test_kn.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# -*- coding: utf-8 -*-
2+
# Copyright (c) 2003, Taro Ogawa. All Rights Reserved.
3+
# Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved.
4+
5+
# This library is free software; you can redistribute it and/or
6+
# modify it under the terms of the GNU Lesser General Public
7+
# License as published by the Free Software Foundation; either
8+
# version 2.1 of the License, or (at your option) any later version.
9+
# This library is distributed in the hope that it will be useful,
10+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12+
# Lesser General Public License for more details.
13+
# You should have received a copy of the GNU Lesser General Public
14+
# License along with this library; if not, write to the Free Software
15+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
16+
# MA 02110-1301 USA
17+
18+
19+
from unittest import TestCase
20+
21+
from num2words import num2words
22+
23+
24+
class Num2WordsKNTest(TestCase):
25+
def test_numbers(self):
26+
self.assertEqual(num2words(42, lang="kn"), u"ನಲವತ್ತ್ ಎರಡು")
27+
self.assertEqual(num2words(893, lang="kn"), u"ಎಂಟು ನೂರ ತೊಂಬತ್ತ ಮೂರು")
28+
self.assertEqual(
29+
num2words(1729, lang="kn"), u"ಒಂದು ಸಾವಿರ ಏಳು ನೂರ ಇಪ್ಪತ್ತ್ಒಂಬತ್ತು"
30+
)
31+
self.assertEqual(num2words(123, lang="kn"), u"ಒಂದು ನೂರ ಇಪ್ಪತ್ತ್ ಮೂರು")
32+
self.assertEqual(num2words(32211, lang="kn"),
33+
u"ಮೂವತ್ತ್ಎರಡು ಸಾವಿರ ಎರಡು ನೂರ ಹನ್ನೊಂದು")
34+
35+
def test_cardinal_for_float_number(self):
36+
self.assertEqual(num2words(3.14, lang="kn"), u"ಮೂರು ಬಿಂದು ಒಂದು ನಾಲ್ಕು")
37+
self.assertEqual(num2words(1.61803, lang="kn"),
38+
u"ಒಂದು ಬಿಂದು ಆರು ಒಂದು ಎಂಟು ಸೊನ್ನೆ ಮೂರು")
39+
40+
def test_ordinal(self):
41+
self.assertEqual(
42+
num2words(1, lang='kn', to='ordinal'),
43+
u'ಒಂದನೇ'
44+
)
45+
self.assertEqual(
46+
num2words(22, lang='kn', to='ordinal'),
47+
u'ಇಪ್ಪತ್ತ್ ಎರಡನೇ'
48+
)
49+
self.assertEqual(
50+
num2words(12, lang='kn', to='ordinal'),
51+
u'ಹನ್ನೆರಡನೇ'
52+
)
53+
self.assertEqual(
54+
num2words(130, lang='kn', to='ordinal'),
55+
u'ಒಂದು ನೂರ ಮೂವತ್ತನೇ'
56+
)
57+
self.assertEqual(
58+
num2words(1003, lang='kn', to='ordinal'),
59+
u'ಒಂದು ಸಾವಿರದ ಮೂರನೇ'
60+
)
61+
62+
def test_ordinal_num(self):
63+
self.assertEqual(num2words(2, lang="kn", ordinal=True), u"ಎರಡನೇ")
64+
self.assertEqual(num2words(5, lang="kn", ordinal=True), u"ಐದನೇ")
65+
self.assertEqual(num2words(16, lang="kn", ordinal=True), u"ಹದಿನಾರನೇ")
66+
self.assertEqual(num2words(113, lang="kn", ordinal=True),
67+
u"ಒಂದು ನೂರ ಹದಿಮೂರನೇ")

0 commit comments

Comments
 (0)