num2words2 0.1.0.dev1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- num2words2/README.md +69 -0
- num2words2/__init__.py +196 -0
- num2words2/_version.py +3 -0
- num2words2/base.py +377 -0
- num2words2/compat.py +29 -0
- num2words2/currency.py +60 -0
- num2words2/lang_AF.py +202 -0
- num2words2/lang_AM.py +193 -0
- num2words2/lang_AR.py +435 -0
- num2words2/lang_AS.py +119 -0
- num2words2/lang_AZ.py +208 -0
- num2words2/lang_BA.py +119 -0
- num2words2/lang_BE.py +356 -0
- num2words2/lang_BG.py +393 -0
- num2words2/lang_BN.py +242 -0
- num2words2/lang_BO.py +122 -0
- num2words2/lang_BR.py +135 -0
- num2words2/lang_BS.py +189 -0
- num2words2/lang_CA.py +476 -0
- num2words2/lang_CE.py +546 -0
- num2words2/lang_CS.py +260 -0
- num2words2/lang_CY.py +574 -0
- num2words2/lang_DA.py +170 -0
- num2words2/lang_DE.py +180 -0
- num2words2/lang_EL.py +338 -0
- num2words2/lang_EN.py +118 -0
- num2words2/lang_EN_IN.py +26 -0
- num2words2/lang_EN_NG.py +45 -0
- num2words2/lang_EO.py +130 -0
- num2words2/lang_ES.py +399 -0
- num2words2/lang_ES_CO.py +37 -0
- num2words2/lang_ES_CR.py +38 -0
- num2words2/lang_ES_GT.py +37 -0
- num2words2/lang_ES_NI.py +35 -0
- num2words2/lang_ES_VE.py +43 -0
- num2words2/lang_ET.py +393 -0
- num2words2/lang_EU.py +158 -0
- num2words2/lang_EUR.py +104 -0
- num2words2/lang_FA.py +187 -0
- num2words2/lang_FI.py +759 -0
- num2words2/lang_FO.py +136 -0
- num2words2/lang_FR.py +133 -0
- num2words2/lang_FR_BE.py +49 -0
- num2words2/lang_FR_CH.py +48 -0
- num2words2/lang_FR_DZ.py +35 -0
- num2words2/lang_GL.py +135 -0
- num2words2/lang_GU.py +172 -0
- num2words2/lang_HA.py +293 -0
- num2words2/lang_HAW.py +144 -0
- num2words2/lang_HE.py +314 -0
- num2words2/lang_HI.py +243 -0
- num2words2/lang_HR.py +304 -0
- num2words2/lang_HT.py +136 -0
- num2words2/lang_HU.py +189 -0
- num2words2/lang_HY.py +364 -0
- num2words2/lang_ID.py +242 -0
- num2words2/lang_IS.py +208 -0
- num2words2/lang_IT.py +265 -0
- num2words2/lang_JA.py +615 -0
- num2words2/lang_JW.py +136 -0
- num2words2/lang_KA.py +169 -0
- num2words2/lang_KK.py +136 -0
- num2words2/lang_KM.py +173 -0
- num2words2/lang_KN.py +182 -0
- num2words2/lang_KO.py +175 -0
- num2words2/lang_KZ.py +161 -0
- num2words2/lang_LA.py +135 -0
- num2words2/lang_LB.py +135 -0
- num2words2/lang_LN.py +136 -0
- num2words2/lang_LO.py +149 -0
- num2words2/lang_LT.py +283 -0
- num2words2/lang_LV.py +266 -0
- num2words2/lang_MG.py +143 -0
- num2words2/lang_MI.py +151 -0
- num2words2/lang_MK.py +136 -0
- num2words2/lang_ML.py +159 -0
- num2words2/lang_MN.py +319 -0
- num2words2/lang_MR.py +187 -0
- num2words2/lang_MS.py +293 -0
- num2words2/lang_MT.py +159 -0
- num2words2/lang_MY.py +152 -0
- num2words2/lang_NE.py +157 -0
- num2words2/lang_NL.py +204 -0
- num2words2/lang_NN.py +136 -0
- num2words2/lang_NO.py +143 -0
- num2words2/lang_OC.py +135 -0
- num2words2/lang_PA.py +159 -0
- num2words2/lang_PL.py +336 -0
- num2words2/lang_PS.py +136 -0
- num2words2/lang_PT.py +280 -0
- num2words2/lang_PT_BR.py +224 -0
- num2words2/lang_RO.py +183 -0
- num2words2/lang_RU.py +570 -0
- num2words2/lang_SA.py +136 -0
- num2words2/lang_SD.py +136 -0
- num2words2/lang_SI.py +152 -0
- num2words2/lang_SK.py +250 -0
- num2words2/lang_SL.py +306 -0
- num2words2/lang_SN.py +447 -0
- num2words2/lang_SO.py +136 -0
- num2words2/lang_SQ.py +252 -0
- num2words2/lang_SR.py +254 -0
- num2words2/lang_SU.py +136 -0
- num2words2/lang_SV.py +169 -0
- num2words2/lang_SW.py +219 -0
- num2words2/lang_TA.py +303 -0
- num2words2/lang_TE.py +169 -0
- num2words2/lang_TET.py +285 -0
- num2words2/lang_TG.py +149 -0
- num2words2/lang_TH.py +214 -0
- num2words2/lang_TK.py +136 -0
- num2words2/lang_TL.py +145 -0
- num2words2/lang_TR.py +882 -0
- num2words2/lang_TT.py +136 -0
- num2words2/lang_UK.py +1101 -0
- num2words2/lang_UR.py +168 -0
- num2words2/lang_UZ.py +136 -0
- num2words2/lang_VI.py +143 -0
- num2words2/lang_WO.py +136 -0
- num2words2/lang_YI.py +135 -0
- num2words2/lang_YO.py +136 -0
- num2words2/lang_ZH.py +296 -0
- num2words2/lang_ZH_CN.py +85 -0
- num2words2/lang_ZH_HK.py +48 -0
- num2words2/lang_ZH_TW.py +198 -0
- num2words2/utils.py +35 -0
- num2words2-0.1.0.dev1.data/scripts/num2words2 +98 -0
- num2words2-0.1.0.dev1.dist-info/METADATA +244 -0
- num2words2-0.1.0.dev1.dist-info/RECORD +133 -0
- num2words2-0.1.0.dev1.dist-info/WHEEL +5 -0
- num2words2-0.1.0.dev1.dist-info/entry_points.txt +2 -0
- num2words2-0.1.0.dev1.dist-info/licenses/COPYING +145 -0
- num2words2-0.1.0.dev1.dist-info/top_level.txt +1 -0
num2words2/lang_MN.py
ADDED
|
@@ -0,0 +1,319 @@
|
|
|
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
|
+
from __future__ import unicode_literals
|
|
19
|
+
|
|
20
|
+
from .base import Num2Word_Base
|
|
21
|
+
from .utils import get_digits, splitbyx
|
|
22
|
+
|
|
23
|
+
ZERO = 'тэг'
|
|
24
|
+
|
|
25
|
+
ONES = {
|
|
26
|
+
1: ('нэг', 'нэг'),
|
|
27
|
+
2: ('хоёр', 'хоёр'),
|
|
28
|
+
3: ('гурав', 'гурван'),
|
|
29
|
+
4: ('дөрөв', 'дөрвөн'),
|
|
30
|
+
5: ('тав', 'таван'),
|
|
31
|
+
6: ('зургаа', 'зургаан'),
|
|
32
|
+
7: ('долоо', 'долоон'),
|
|
33
|
+
8: ('найм', 'найман'),
|
|
34
|
+
9: ('ес', 'есөн'),
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
TEN = ('арав', 'арван')
|
|
38
|
+
|
|
39
|
+
TWENTIES = {
|
|
40
|
+
2: ('хорь', 'хорин'),
|
|
41
|
+
3: ('гуч', 'гучин'),
|
|
42
|
+
4: ('дөч', 'дөчин'),
|
|
43
|
+
5: ('тавь', 'тавин'),
|
|
44
|
+
6: ('жар', 'жаран'),
|
|
45
|
+
7: ('дал', 'далан'),
|
|
46
|
+
8: ('ная', 'наян'),
|
|
47
|
+
9: ('ер', 'ерэн'),
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
HUNDRED = ('зуу', 'зуун')
|
|
51
|
+
|
|
52
|
+
THOUSANDS = {
|
|
53
|
+
1: "мянга", # 10^3
|
|
54
|
+
2: "сая", # 10^6
|
|
55
|
+
3: "тэрбум", # 10^9
|
|
56
|
+
4: "их наяд", # 10^12
|
|
57
|
+
5: "тунамал", # 10^15
|
|
58
|
+
6: "их ингүүмэл", # 10^18
|
|
59
|
+
7: "ялгаруулагч", # 10^21
|
|
60
|
+
8: "их өөр дээр", # 10^24
|
|
61
|
+
9: "хязгаар үзэгдэл", # 10^27
|
|
62
|
+
10: "их шалтгааны зүйл", # 10^30
|
|
63
|
+
11: "эрхт", # 10^33
|
|
64
|
+
12: "их сайтар хүргэсэн", # 10^36
|
|
65
|
+
13: "живэх тоосон билэг", # 10^39
|
|
66
|
+
14: "их билэг тэмдэг", # 10^42
|
|
67
|
+
15: "тохио мэдэхүй", # 10^45
|
|
68
|
+
16: "их тийн болсон", # 10^48
|
|
69
|
+
17: "асрахуй", # 10^51
|
|
70
|
+
18: "их нигүүлсэнгүй", # 10^54
|
|
71
|
+
19: "тоолшгүй", # 10^57
|
|
72
|
+
20: "өгүүлшгүй", # 10^60
|
|
73
|
+
21: "үлэшгүй", # 10^63
|
|
74
|
+
22: "сэтгэшгүй", # 10^66
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
POINT_WORDS = {
|
|
78
|
+
1: 'аравны',
|
|
79
|
+
2: 'зууны',
|
|
80
|
+
3: 'мянганы',
|
|
81
|
+
4: 'арван мянганы',
|
|
82
|
+
5: 'зуун мянганы',
|
|
83
|
+
6: 'саяны',
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class Num2Word_MN(Num2Word_Base):
|
|
88
|
+
|
|
89
|
+
CURRENCY_FORMS = {
|
|
90
|
+
"AED": (("дирхам",), ("филс",)),
|
|
91
|
+
"AUD": (("доллар",), ("цент",)),
|
|
92
|
+
"BGN": (("лев",), ("стотинка",)),
|
|
93
|
+
"CAD": (("доллар",), ("цент",)),
|
|
94
|
+
"CHF": (("франк",), ("раппен",)),
|
|
95
|
+
"CNY": (("юань",), ("фэнь",)),
|
|
96
|
+
"CZK": (("крон",), ("галерж",)),
|
|
97
|
+
"DKK": (("крон",), ("өре",)),
|
|
98
|
+
"EGP": (("фунт",), ("пиастр",)),
|
|
99
|
+
"EUR": (("евро",), ("цент",)),
|
|
100
|
+
"GBP": (("фунт стерлинг",), ("пенс",)),
|
|
101
|
+
"HKD": (("доллар",), ("цент",)),
|
|
102
|
+
"HUF": (("форинт",), ("филлер",)),
|
|
103
|
+
"IDR": (("рупи",), ("сен",)),
|
|
104
|
+
"INR": (("рупи",), ("пайса",)),
|
|
105
|
+
"JPY": (("иен",), ("сен",)),
|
|
106
|
+
"KPW": (("вон",), ("чон",)),
|
|
107
|
+
"KRW": (("вон",), ("чон",)),
|
|
108
|
+
"KWD": (("динaр",), ("филс",)),
|
|
109
|
+
"KZT": (("тенге",), ("тийн",)),
|
|
110
|
+
"MNT": (("төгрөг",), ("мөнгө",)),
|
|
111
|
+
"MYR": (("ринггит",), ("сен",)),
|
|
112
|
+
"NOK": (("крон",), ("өре",)),
|
|
113
|
+
"NPR": (("рупи",), ("пайса",)),
|
|
114
|
+
"NZD": (("доллар",), ("цент",)),
|
|
115
|
+
"PLN": (("злот",), ("грош",)),
|
|
116
|
+
"RUB": (("рубль",), ("копейк",)),
|
|
117
|
+
"SEK": (("крон",), ("өре",)),
|
|
118
|
+
"SGD": (("доллар",), ("цент",)),
|
|
119
|
+
"THB": (("бат",), ("сатанг",)),
|
|
120
|
+
"TRY": (("лира",), ("куруш",)),
|
|
121
|
+
"TWD": (("доллар",), ("сентао",)),
|
|
122
|
+
"UAH": (("гривн",), ("копейк",)),
|
|
123
|
+
"USD": (("доллар",), ("цент",)),
|
|
124
|
+
"VND": (("донг",), ("су",)),
|
|
125
|
+
"ZAR": (("ранд",), ("сента",))
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
CURRENCY_ADJECTIVES = {
|
|
129
|
+
"AUD": "Австралийн",
|
|
130
|
+
"CAD": "Канадын",
|
|
131
|
+
"CZK": "Чехийн ",
|
|
132
|
+
"DKK": "Данийн",
|
|
133
|
+
"HKD": "Хонконг",
|
|
134
|
+
"IDR": "Индонезийн",
|
|
135
|
+
"INR": "Энэтхэгийн",
|
|
136
|
+
"KPW": "БНАСАУ-ын",
|
|
137
|
+
"KRW": "БНСУ-ын",
|
|
138
|
+
"NOK": "Норвегийн",
|
|
139
|
+
"NPR": "Непалын",
|
|
140
|
+
"NZD": "Шинэ Зеландын",
|
|
141
|
+
"SEK": "Шведийн",
|
|
142
|
+
"SGD": "Сингапур",
|
|
143
|
+
"TWD": "Тайванийн",
|
|
144
|
+
"USD": "Америк"
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
def setup(self):
|
|
148
|
+
self.negword = "хасах"
|
|
149
|
+
|
|
150
|
+
def to_cardinal(self, value, all_suffixed=False):
|
|
151
|
+
n = str(value).replace(',', '.')
|
|
152
|
+
if '.' in n:
|
|
153
|
+
is_negative = n.startswith('-')
|
|
154
|
+
abs_n = n[1:] if is_negative else n
|
|
155
|
+
left, right = abs_n.split('.')
|
|
156
|
+
|
|
157
|
+
# Бутархай хэсэг нь тэг бол бүхэл тоо шиг хувирна
|
|
158
|
+
if int(right) == 0:
|
|
159
|
+
return self._int2word(int(float(n)), all_suffixed=all_suffixed)
|
|
160
|
+
|
|
161
|
+
fractional_length = len(right)
|
|
162
|
+
if fractional_length > 6:
|
|
163
|
+
raise NotImplementedError()
|
|
164
|
+
|
|
165
|
+
result = '%s, %s %s' % (
|
|
166
|
+
self._int2word(int(left), all_suffixed=all_suffixed),
|
|
167
|
+
POINT_WORDS[fractional_length],
|
|
168
|
+
self._int2word(int(right), all_suffixed=all_suffixed)
|
|
169
|
+
)
|
|
170
|
+
if is_negative:
|
|
171
|
+
result = self.negword + ' ' + result
|
|
172
|
+
return result
|
|
173
|
+
else:
|
|
174
|
+
return self._int2word(int(n), all_suffixed=all_suffixed)
|
|
175
|
+
|
|
176
|
+
def pluralize(self, n, form):
|
|
177
|
+
return form[0]
|
|
178
|
+
|
|
179
|
+
def _int2word(self, n, all_suffixed=False):
|
|
180
|
+
if n < 0:
|
|
181
|
+
return ' '.join([self.negword, self._int2word(abs(n))])
|
|
182
|
+
|
|
183
|
+
if n == 0:
|
|
184
|
+
return ZERO
|
|
185
|
+
|
|
186
|
+
words = []
|
|
187
|
+
chunks = list(splitbyx(str(n), 3))
|
|
188
|
+
|
|
189
|
+
i = len(chunks)
|
|
190
|
+
|
|
191
|
+
for x in chunks:
|
|
192
|
+
|
|
193
|
+
i -= 1
|
|
194
|
+
|
|
195
|
+
if x == 0:
|
|
196
|
+
continue
|
|
197
|
+
|
|
198
|
+
n1, n2, n3 = get_digits(x)
|
|
199
|
+
|
|
200
|
+
use_suffix1 = use_suffix2 = use_suffix3 = True
|
|
201
|
+
if (not all_suffixed) and i == 0:
|
|
202
|
+
if n1 == 0 and n2 == 0:
|
|
203
|
+
use_suffix3 = False
|
|
204
|
+
elif n1 == 0:
|
|
205
|
+
use_suffix2 = False
|
|
206
|
+
else:
|
|
207
|
+
use_suffix1 = False
|
|
208
|
+
|
|
209
|
+
if n3 > 0:
|
|
210
|
+
if n3 > 1:
|
|
211
|
+
words.append(ONES[n3][1])
|
|
212
|
+
words.append(HUNDRED[1 if use_suffix3 else 0])
|
|
213
|
+
|
|
214
|
+
if n2 == 1:
|
|
215
|
+
words.append(TEN[1 if use_suffix2 else 0])
|
|
216
|
+
elif n2 > 1:
|
|
217
|
+
words.append(TWENTIES[n2][1 if use_suffix2 else 0])
|
|
218
|
+
|
|
219
|
+
if n1 > 0:
|
|
220
|
+
words.append(ONES[n1][1 if use_suffix1 else 0])
|
|
221
|
+
|
|
222
|
+
if i > 0:
|
|
223
|
+
words.append(THOUSANDS[i])
|
|
224
|
+
|
|
225
|
+
if all_suffixed and words and words[-1] == 'мянга':
|
|
226
|
+
words[-1] = 'мянган'
|
|
227
|
+
|
|
228
|
+
return ' '.join(words)
|
|
229
|
+
|
|
230
|
+
def to_ordinal(self, value):
|
|
231
|
+
number = int(value)
|
|
232
|
+
return "%s %s" % (
|
|
233
|
+
self.to_cardinal(number),
|
|
234
|
+
self._get_ordinal_suffix(number),
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
def to_ordinal_num(self, value):
|
|
238
|
+
number = int(value)
|
|
239
|
+
return '%s %s' % (number, self._get_ordinal_suffix(number))
|
|
240
|
+
|
|
241
|
+
def _get_ordinal_suffix(self, number):
|
|
242
|
+
number_str = str(number)
|
|
243
|
+
suffix = 'дугаар'
|
|
244
|
+
if number_str[-1] != '0':
|
|
245
|
+
if number_str[-1] in ('1', '4', '9'):
|
|
246
|
+
suffix = 'дүгээр'
|
|
247
|
+
elif number_str[-2] != '0':
|
|
248
|
+
if number_str[-2] in ('4', '9'):
|
|
249
|
+
suffix = 'дүгээр'
|
|
250
|
+
return suffix
|
|
251
|
+
|
|
252
|
+
def to_year(self, value):
|
|
253
|
+
prefix = ''
|
|
254
|
+
if value < 0:
|
|
255
|
+
value = abs(value)
|
|
256
|
+
prefix = 'МЭӨ '
|
|
257
|
+
return '%s%s он' % (prefix, self.to_cardinal(value, all_suffixed=True))
|
|
258
|
+
|
|
259
|
+
def _money_verbose(self, number, currency):
|
|
260
|
+
return self.to_cardinal(number, all_suffixed=True)
|
|
261
|
+
|
|
262
|
+
def _cents_verbose(self, number, currency):
|
|
263
|
+
return self.to_cardinal(number, all_suffixed=True)
|
|
264
|
+
|
|
265
|
+
def to_currency(self, val, currency='MNT', cents=True, separator=',',
|
|
266
|
+
adjective=True):
|
|
267
|
+
# If input is an integer, just return the cardinal number
|
|
268
|
+
if isinstance(val, int):
|
|
269
|
+
return self.to_cardinal(val)
|
|
270
|
+
|
|
271
|
+
# For float/decimal, use the full currency format
|
|
272
|
+
# Check if value has fractional cents
|
|
273
|
+
from decimal import Decimal
|
|
274
|
+
|
|
275
|
+
from .currency import parse_currency_parts
|
|
276
|
+
decimal_val = Decimal(str(val))
|
|
277
|
+
has_fractional_cents = (decimal_val * 100) % 1 != 0
|
|
278
|
+
|
|
279
|
+
left, right, is_negative = parse_currency_parts(val, is_int_with_cents=False,
|
|
280
|
+
keep_precision=has_fractional_cents)
|
|
281
|
+
|
|
282
|
+
try:
|
|
283
|
+
cr1, cr2 = self.CURRENCY_FORMS[currency]
|
|
284
|
+
except KeyError:
|
|
285
|
+
raise NotImplementedError(
|
|
286
|
+
'Currency code "%s" not implemented for "%s"' %
|
|
287
|
+
(currency, self.__class__.__name__))
|
|
288
|
+
|
|
289
|
+
if adjective and currency in self.CURRENCY_ADJECTIVES:
|
|
290
|
+
from .currency import prefix_currency
|
|
291
|
+
cr1 = prefix_currency(self.CURRENCY_ADJECTIVES[currency], cr1)
|
|
292
|
+
|
|
293
|
+
minus_str = "%s " % self.negword.strip() if is_negative else ""
|
|
294
|
+
money_str = self._money_verbose(left, currency)
|
|
295
|
+
|
|
296
|
+
# Don't include cents if they are zero
|
|
297
|
+
if right > 0:
|
|
298
|
+
# Handle fractional cents
|
|
299
|
+
from decimal import Decimal
|
|
300
|
+
if isinstance(right, Decimal):
|
|
301
|
+
# Convert fractional cents (e.g., 65.3 cents)
|
|
302
|
+
cents_str = self.to_cardinal(float(right)) if cents else str(float(right))
|
|
303
|
+
else:
|
|
304
|
+
cents_str = self._cents_verbose(right, currency) \
|
|
305
|
+
if cents else str(right)
|
|
306
|
+
return u'%s%s %s%s %s %s' % (
|
|
307
|
+
minus_str,
|
|
308
|
+
money_str,
|
|
309
|
+
self.pluralize(left, cr1),
|
|
310
|
+
separator,
|
|
311
|
+
cents_str,
|
|
312
|
+
self.pluralize(right, cr2)
|
|
313
|
+
)
|
|
314
|
+
else:
|
|
315
|
+
return u'%s%s %s' % (
|
|
316
|
+
minus_str,
|
|
317
|
+
money_str,
|
|
318
|
+
self.pluralize(left, cr1)
|
|
319
|
+
)
|
num2words2/lang_MR.py
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
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
|
+
from __future__ import unicode_literals
|
|
19
|
+
|
|
20
|
+
from .base import Num2Word_Base
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
# Marathi language support
|
|
24
|
+
class Num2Word_MR(Num2Word_Base):
|
|
25
|
+
CURRENCY_FORMS = {
|
|
26
|
+
'INR': (('रुपया', 'रुपये'), ('पैसा', 'पैसे')),
|
|
27
|
+
'USD': (('डॉलर', 'डॉलर'), ('सेंट', 'सेंट्स')),
|
|
28
|
+
'EUR': (('युरो', 'युरो'), ('सेंट', 'सेंट्स')),
|
|
29
|
+
'GBP': (('पाउंड', 'पाउंड'), ('पेन्स', 'पेन्स')),
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
def setup(self):
|
|
33
|
+
self.negword = "ऋण "
|
|
34
|
+
self.pointword = "दशांश"
|
|
35
|
+
|
|
36
|
+
def to_cardinal(self, number):
|
|
37
|
+
"""Convert a number to its word representation in Marathi."""
|
|
38
|
+
n = str(number).strip()
|
|
39
|
+
|
|
40
|
+
if n.startswith('-'):
|
|
41
|
+
n = n[1:]
|
|
42
|
+
ret = self.negword
|
|
43
|
+
else:
|
|
44
|
+
ret = ""
|
|
45
|
+
|
|
46
|
+
if '.' in n:
|
|
47
|
+
left, right = n.split('.', 1)
|
|
48
|
+
ret += self._int_to_word(int(left)) + " " + self.pointword + " "
|
|
49
|
+
ret += " ".join(self._int_to_word(int(d)) for d in right)
|
|
50
|
+
return ret.strip()
|
|
51
|
+
else:
|
|
52
|
+
return (ret + self._int_to_word(int(n))).strip()
|
|
53
|
+
|
|
54
|
+
def _int_to_word(self, number):
|
|
55
|
+
"""Convert an integer to its word representation in Marathi."""
|
|
56
|
+
if number == 0:
|
|
57
|
+
return "शून्य"
|
|
58
|
+
|
|
59
|
+
# Marathi number words
|
|
60
|
+
ones = ["", "एक", "दोन", "तीन", "चार", "पाच", "सहा", "सात", "आठ", "नऊ"]
|
|
61
|
+
tens = ["", "दहा", "वीस", "तीस", "चाळीस", "पन्नास", "साठ", "सत्तर", "ऐंशी", "नव्वद"]
|
|
62
|
+
teens = ["दहा", "अकरा", "बारा", "तेरा", "चौदा", "पंधरा", "सोळा", "सतरा", "अठरा", "एकोणीस"]
|
|
63
|
+
|
|
64
|
+
if number < 0:
|
|
65
|
+
return self.negword + self._int_to_word(abs(number))
|
|
66
|
+
elif number < 10:
|
|
67
|
+
return ones[number]
|
|
68
|
+
elif number < 20:
|
|
69
|
+
return teens[number - 10]
|
|
70
|
+
elif number < 100:
|
|
71
|
+
result = tens[number // 10]
|
|
72
|
+
if number % 10:
|
|
73
|
+
if number // 10 == 2: # Special case for 20s
|
|
74
|
+
result = "एक" + tens[2] if number == 21 else ones[number % 10] + tens[2]
|
|
75
|
+
elif number // 10 == 9 and number % 10 == 9: # 99
|
|
76
|
+
result = "नव्याण्णव"
|
|
77
|
+
else:
|
|
78
|
+
result += " " + ones[number % 10] if number % 10 else ""
|
|
79
|
+
return result
|
|
80
|
+
elif number < 1000:
|
|
81
|
+
result = ones[number // 100] + "शे"
|
|
82
|
+
remainder = number % 100
|
|
83
|
+
if remainder:
|
|
84
|
+
result += " " + self._int_to_word(remainder)
|
|
85
|
+
return result
|
|
86
|
+
elif number < 100000: # Indian lakh system
|
|
87
|
+
result = self._int_to_word(number // 1000) + " हजार"
|
|
88
|
+
remainder = number % 1000
|
|
89
|
+
if remainder:
|
|
90
|
+
result += " " + self._int_to_word(remainder)
|
|
91
|
+
return result
|
|
92
|
+
elif number < 10000000: # 1 crore
|
|
93
|
+
result = self._int_to_word(number // 100000) + " लाख"
|
|
94
|
+
remainder = number % 100000
|
|
95
|
+
if remainder:
|
|
96
|
+
result += " " + self._int_to_word(remainder)
|
|
97
|
+
return result
|
|
98
|
+
elif number < 1000000000: # Less than 100 crore
|
|
99
|
+
result = self._int_to_word(number // 10000000) + " कोटी"
|
|
100
|
+
remainder = number % 10000000
|
|
101
|
+
if remainder:
|
|
102
|
+
result += " " + self._int_to_word(remainder)
|
|
103
|
+
return result
|
|
104
|
+
elif number < 100000000000: # Arab
|
|
105
|
+
result = self._int_to_word(number // 1000000000) + " अब्ज"
|
|
106
|
+
remainder = number % 1000000000
|
|
107
|
+
if remainder:
|
|
108
|
+
result += " " + self._int_to_word(remainder)
|
|
109
|
+
return result
|
|
110
|
+
else: # Kharab
|
|
111
|
+
result = self._int_to_word(number // 100000000000) + " खर्व"
|
|
112
|
+
remainder = number % 100000000000
|
|
113
|
+
if remainder:
|
|
114
|
+
result += " " + self._int_to_word(remainder)
|
|
115
|
+
return result
|
|
116
|
+
|
|
117
|
+
def to_ordinal(self, number):
|
|
118
|
+
"""Convert to ordinal in Marathi."""
|
|
119
|
+
# Special ordinals
|
|
120
|
+
if number == 1:
|
|
121
|
+
return "पहिला"
|
|
122
|
+
elif number == 2:
|
|
123
|
+
return "दुसरा"
|
|
124
|
+
elif number == 3:
|
|
125
|
+
return "तिसरा"
|
|
126
|
+
elif number == 4:
|
|
127
|
+
return "चौथा"
|
|
128
|
+
elif number == 5:
|
|
129
|
+
return "पाचवा"
|
|
130
|
+
elif number == 6:
|
|
131
|
+
return "सहावा"
|
|
132
|
+
elif number == 7:
|
|
133
|
+
return "सातवा"
|
|
134
|
+
elif number == 8:
|
|
135
|
+
return "आठवा"
|
|
136
|
+
elif number == 9:
|
|
137
|
+
return "नववा"
|
|
138
|
+
elif number == 10:
|
|
139
|
+
return "दहावा"
|
|
140
|
+
else:
|
|
141
|
+
cardinal = self.to_cardinal(number)
|
|
142
|
+
return cardinal + "वा"
|
|
143
|
+
|
|
144
|
+
def to_ordinal_num(self, number):
|
|
145
|
+
"""Convert to abbreviated ordinal."""
|
|
146
|
+
if number == 1:
|
|
147
|
+
return "१ला"
|
|
148
|
+
elif number == 2:
|
|
149
|
+
return "२रा"
|
|
150
|
+
elif number == 3:
|
|
151
|
+
return "३रा"
|
|
152
|
+
elif number == 4:
|
|
153
|
+
return "४था"
|
|
154
|
+
else:
|
|
155
|
+
return str(number) + "वा"
|
|
156
|
+
|
|
157
|
+
def to_year(self, val, longval=True):
|
|
158
|
+
"""Convert to year in Marathi."""
|
|
159
|
+
if val < 0:
|
|
160
|
+
return "इसवीसन पूर्व " + self.to_cardinal(abs(val))
|
|
161
|
+
else:
|
|
162
|
+
return "सन " + self.to_cardinal(val)
|
|
163
|
+
|
|
164
|
+
def to_currency(self, val, currency='INR', cents=True, separator=' आणि ', adjective=False):
|
|
165
|
+
"""Convert to currency in Marathi."""
|
|
166
|
+
is_negative = False
|
|
167
|
+
if val < 0:
|
|
168
|
+
is_negative = True
|
|
169
|
+
val = abs(val)
|
|
170
|
+
|
|
171
|
+
parts = str(val).split('.')
|
|
172
|
+
left = int(parts[0]) if parts[0] else 0
|
|
173
|
+
right = int(parts[1][:2].ljust(2, '0')) if len(parts) > 1 and parts[1] else 0
|
|
174
|
+
|
|
175
|
+
cr1, cr2 = self.CURRENCY_FORMS.get(currency, self.CURRENCY_FORMS['INR'])
|
|
176
|
+
|
|
177
|
+
left_str = self._int_to_word(left)
|
|
178
|
+
result = left_str + " " + (cr1[1] if left != 1 else cr1[0])
|
|
179
|
+
|
|
180
|
+
if cents and right:
|
|
181
|
+
cents_str = self._int_to_word(right)
|
|
182
|
+
result += separator + cents_str + " " + (cr2[1] if right != 1 else cr2[0])
|
|
183
|
+
|
|
184
|
+
if is_negative:
|
|
185
|
+
result = self.negword + result
|
|
186
|
+
|
|
187
|
+
return result.strip()
|