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_MS.py
ADDED
|
@@ -0,0 +1,293 @@
|
|
|
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 decimal import Decimal
|
|
21
|
+
|
|
22
|
+
from .base import Num2Word_Base
|
|
23
|
+
from .currency import parse_currency_parts
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class Num2Word_MS(Num2Word_Base):
|
|
27
|
+
CURRENCY_FORMS = {
|
|
28
|
+
'MYR': (
|
|
29
|
+
('ringgit', 'ringgit'), ('sen', 'sen')
|
|
30
|
+
),
|
|
31
|
+
'SGD': (
|
|
32
|
+
('dolar', 'dolar'), ('sen', 'sen')
|
|
33
|
+
),
|
|
34
|
+
'USD': (
|
|
35
|
+
('dolar', 'dolar'), ('sen', 'sen')
|
|
36
|
+
),
|
|
37
|
+
'EUR': (
|
|
38
|
+
('euro', 'euro'), ('sen', 'sen')
|
|
39
|
+
),
|
|
40
|
+
'GBP': (
|
|
41
|
+
('paun', 'paun'), ('peni', 'peni')
|
|
42
|
+
),
|
|
43
|
+
'IDR': (
|
|
44
|
+
('rupiah', 'rupiah'), ('sen', 'sen')
|
|
45
|
+
),
|
|
46
|
+
'BND': (
|
|
47
|
+
('dolar', 'dolar'), ('sen', 'sen')
|
|
48
|
+
),
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
def __init__(self):
|
|
52
|
+
super(Num2Word_MS, self).__init__()
|
|
53
|
+
|
|
54
|
+
self.ones = [
|
|
55
|
+
'',
|
|
56
|
+
'satu',
|
|
57
|
+
'dua',
|
|
58
|
+
'tiga',
|
|
59
|
+
'empat',
|
|
60
|
+
'lima',
|
|
61
|
+
'enam',
|
|
62
|
+
'tujuh',
|
|
63
|
+
'lapan',
|
|
64
|
+
'sembilan'
|
|
65
|
+
]
|
|
66
|
+
|
|
67
|
+
self.tens = [
|
|
68
|
+
'',
|
|
69
|
+
'sepuluh',
|
|
70
|
+
'dua puluh',
|
|
71
|
+
'tiga puluh',
|
|
72
|
+
'empat puluh',
|
|
73
|
+
'lima puluh',
|
|
74
|
+
'enam puluh',
|
|
75
|
+
'tujuh puluh',
|
|
76
|
+
'lapan puluh',
|
|
77
|
+
'sembilan puluh'
|
|
78
|
+
]
|
|
79
|
+
|
|
80
|
+
self.teens = {
|
|
81
|
+
11: 'sebelas',
|
|
82
|
+
12: 'dua belas',
|
|
83
|
+
13: 'tiga belas',
|
|
84
|
+
14: 'empat belas',
|
|
85
|
+
15: 'lima belas',
|
|
86
|
+
16: 'enam belas',
|
|
87
|
+
17: 'tujuh belas',
|
|
88
|
+
18: 'lapan belas',
|
|
89
|
+
19: 'sembilan belas'
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
self.scale = {
|
|
93
|
+
100: 'ratus',
|
|
94
|
+
1000: 'ribu',
|
|
95
|
+
1000000: 'juta',
|
|
96
|
+
1000000000: 'bilion',
|
|
97
|
+
1000000000000: 'trilion'
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
self.ordinals = [
|
|
101
|
+
'',
|
|
102
|
+
'pertama',
|
|
103
|
+
'kedua',
|
|
104
|
+
'ketiga',
|
|
105
|
+
'keempat',
|
|
106
|
+
'kelima',
|
|
107
|
+
'keenam',
|
|
108
|
+
'ketujuh',
|
|
109
|
+
'kelapan',
|
|
110
|
+
'kesembilan',
|
|
111
|
+
'kesepuluh'
|
|
112
|
+
]
|
|
113
|
+
|
|
114
|
+
self.negword = "negatif "
|
|
115
|
+
self.pointword = "titik"
|
|
116
|
+
|
|
117
|
+
def _setup(self):
|
|
118
|
+
super(Num2Word_MS, self)._setup()
|
|
119
|
+
|
|
120
|
+
def _int_to_word(self, n):
|
|
121
|
+
"""
|
|
122
|
+
Converts a number to words in Malay.
|
|
123
|
+
"""
|
|
124
|
+
if n == 0:
|
|
125
|
+
return 'kosong'
|
|
126
|
+
|
|
127
|
+
parts = []
|
|
128
|
+
|
|
129
|
+
# Handle trillions
|
|
130
|
+
if n >= 1000000000000:
|
|
131
|
+
trillions = n // 1000000000000
|
|
132
|
+
if trillions == 1:
|
|
133
|
+
parts.append('satu trilion')
|
|
134
|
+
else:
|
|
135
|
+
parts.append(self._int_to_word(trillions) + ' trilion')
|
|
136
|
+
n %= 1000000000000
|
|
137
|
+
|
|
138
|
+
# Handle billions
|
|
139
|
+
if n >= 1000000000:
|
|
140
|
+
billions = n // 1000000000
|
|
141
|
+
if billions == 1:
|
|
142
|
+
parts.append('satu bilion')
|
|
143
|
+
else:
|
|
144
|
+
parts.append(self._int_to_word(billions) + ' bilion')
|
|
145
|
+
n %= 1000000000
|
|
146
|
+
|
|
147
|
+
# Handle millions
|
|
148
|
+
if n >= 1000000:
|
|
149
|
+
millions = n // 1000000
|
|
150
|
+
if millions == 1:
|
|
151
|
+
parts.append('satu juta')
|
|
152
|
+
else:
|
|
153
|
+
parts.append(self._int_to_word(millions) + ' juta')
|
|
154
|
+
n %= 1000000
|
|
155
|
+
|
|
156
|
+
# Handle thousands
|
|
157
|
+
if n >= 1000:
|
|
158
|
+
thousands = n // 1000
|
|
159
|
+
if thousands == 1:
|
|
160
|
+
parts.append('seribu')
|
|
161
|
+
else:
|
|
162
|
+
parts.append(self._int_to_word(thousands) + ' ribu')
|
|
163
|
+
n %= 1000
|
|
164
|
+
|
|
165
|
+
# Handle hundreds
|
|
166
|
+
if n >= 100:
|
|
167
|
+
hundreds = n // 100
|
|
168
|
+
if hundreds == 1:
|
|
169
|
+
parts.append('seratus')
|
|
170
|
+
else:
|
|
171
|
+
parts.append(self.ones[hundreds] + ' ratus')
|
|
172
|
+
n %= 100
|
|
173
|
+
|
|
174
|
+
# Handle special case for teens (11-19)
|
|
175
|
+
if 10 < n < 20:
|
|
176
|
+
parts.append(self.teens[n])
|
|
177
|
+
else:
|
|
178
|
+
# Handle tens
|
|
179
|
+
if n >= 10:
|
|
180
|
+
if n == 10:
|
|
181
|
+
parts.append('sepuluh')
|
|
182
|
+
else:
|
|
183
|
+
tens_val = n // 10
|
|
184
|
+
parts.append(self.tens[tens_val])
|
|
185
|
+
n %= 10
|
|
186
|
+
|
|
187
|
+
# Handle ones
|
|
188
|
+
if n > 0:
|
|
189
|
+
parts.append(self.ones[n])
|
|
190
|
+
|
|
191
|
+
return ' '.join(parts)
|
|
192
|
+
|
|
193
|
+
def _int_to_cardinal(self, n):
|
|
194
|
+
if n == 0:
|
|
195
|
+
return 'kosong'
|
|
196
|
+
|
|
197
|
+
if n < 0:
|
|
198
|
+
return self.negword + self._int_to_word(-n)
|
|
199
|
+
|
|
200
|
+
return self._int_to_word(n)
|
|
201
|
+
|
|
202
|
+
def _int_to_ordinal(self, n):
|
|
203
|
+
"""Convert to ordinal number."""
|
|
204
|
+
if n == 0:
|
|
205
|
+
return 'kosong'
|
|
206
|
+
|
|
207
|
+
# Special cases for first ten ordinals
|
|
208
|
+
if n <= 10:
|
|
209
|
+
return self.ordinals[n]
|
|
210
|
+
|
|
211
|
+
# For other numbers, use "ke-" prefix
|
|
212
|
+
return 'ke-' + self._int_to_cardinal(n)
|
|
213
|
+
|
|
214
|
+
def to_cardinal(self, n):
|
|
215
|
+
try:
|
|
216
|
+
if isinstance(n, str):
|
|
217
|
+
n = int(n)
|
|
218
|
+
|
|
219
|
+
return self._int_to_cardinal(n)
|
|
220
|
+
except BaseException:
|
|
221
|
+
return self._int_to_cardinal(int(n))
|
|
222
|
+
|
|
223
|
+
def to_ordinal(self, n):
|
|
224
|
+
try:
|
|
225
|
+
if isinstance(n, str):
|
|
226
|
+
n = int(n)
|
|
227
|
+
|
|
228
|
+
return self._int_to_ordinal(n)
|
|
229
|
+
except BaseException:
|
|
230
|
+
return self._int_to_ordinal(int(n))
|
|
231
|
+
|
|
232
|
+
def to_ordinal_num(self, n):
|
|
233
|
+
try:
|
|
234
|
+
if isinstance(n, str):
|
|
235
|
+
n = int(n)
|
|
236
|
+
|
|
237
|
+
# In Malay, ordinal numbers use "ke-" prefix
|
|
238
|
+
return 'ke-' + str(n)
|
|
239
|
+
except BaseException:
|
|
240
|
+
return 'ke-' + str(n)
|
|
241
|
+
|
|
242
|
+
def to_currency(self, n, currency='MYR'):
|
|
243
|
+
try:
|
|
244
|
+
# Check if value has fractional cents
|
|
245
|
+
decimal_val = Decimal(str(n))
|
|
246
|
+
has_fractional_cents = (decimal_val * 100) % 1 != 0
|
|
247
|
+
|
|
248
|
+
left, right, is_negative = parse_currency_parts(n)
|
|
249
|
+
|
|
250
|
+
if currency not in self.CURRENCY_FORMS:
|
|
251
|
+
raise NotImplementedError(
|
|
252
|
+
'Currency code "%s" not implemented for "%s"' %
|
|
253
|
+
(currency, self.__class__.__name__))
|
|
254
|
+
|
|
255
|
+
cr_major, cr_minor = self.CURRENCY_FORMS[currency]
|
|
256
|
+
|
|
257
|
+
result = []
|
|
258
|
+
|
|
259
|
+
if is_negative:
|
|
260
|
+
result.append(self.negword.strip())
|
|
261
|
+
|
|
262
|
+
left_words = self._int_to_cardinal(left)
|
|
263
|
+
result.append(left_words)
|
|
264
|
+
result.append(cr_major[0])
|
|
265
|
+
|
|
266
|
+
# Handle cents if non-zero
|
|
267
|
+
if right > 0:
|
|
268
|
+
if has_fractional_cents:
|
|
269
|
+
# For fractional cents, use float representation
|
|
270
|
+
fractional_cents = right / 100.0
|
|
271
|
+
right_words = self.to_cardinal(fractional_cents)
|
|
272
|
+
else:
|
|
273
|
+
right_words = self._int_to_cardinal(right)
|
|
274
|
+
result.append(right_words)
|
|
275
|
+
result.append(cr_minor[0])
|
|
276
|
+
|
|
277
|
+
return ' '.join(result)
|
|
278
|
+
except NotImplementedError:
|
|
279
|
+
raise
|
|
280
|
+
except BaseException:
|
|
281
|
+
return str(n) + ' ' + currency
|
|
282
|
+
|
|
283
|
+
def to_year(self, n):
|
|
284
|
+
"""Convert to year representation."""
|
|
285
|
+
if n < 1000:
|
|
286
|
+
return self._int_to_cardinal(n)
|
|
287
|
+
elif n < 2000:
|
|
288
|
+
# Years like 1999 -> "seribu sembilan ratus sembilan puluh
|
|
289
|
+
# sembilan"
|
|
290
|
+
return self._int_to_cardinal(n)
|
|
291
|
+
else:
|
|
292
|
+
# Years like 2023 -> "dua ribu dua puluh tiga"
|
|
293
|
+
return self._int_to_cardinal(n)
|
num2words2/lang_MT.py
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
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
|
+
# Maltese language support
|
|
24
|
+
class Num2Word_MT(Num2Word_Base):
|
|
25
|
+
CURRENCY_FORMS = {
|
|
26
|
+
'EUR': (('ewro', 'ewro'), ('ċenteżmu', 'ċenteżmi')),
|
|
27
|
+
'USD': (('dollar', 'dollars'), ('cent', 'cents'))
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
def setup(self):
|
|
31
|
+
self.negword = "minus "
|
|
32
|
+
self.pointword = "point"
|
|
33
|
+
self.ones = ['', 'wieħed', 'tnejn', 'tlieta', 'erbgħa', 'ħamsa', 'sitta', 'sebgħa', 'tmienja', 'disgħa']
|
|
34
|
+
self.tens = ['', 'għaxra', 'għoxrin', 'tletin', 'erbgħin', 'ħamsin', 'sittin', 'sebgħin', 'tmenin', 'disgħin']
|
|
35
|
+
self.hundred = "mija"
|
|
36
|
+
self.thousand = "elf"
|
|
37
|
+
self.million = "miljun"
|
|
38
|
+
|
|
39
|
+
def to_cardinal(self, number):
|
|
40
|
+
"""Convert a number to its word representation in Maltese."""
|
|
41
|
+
n = str(number).strip()
|
|
42
|
+
|
|
43
|
+
if n.startswith('-'):
|
|
44
|
+
n = n[1:]
|
|
45
|
+
ret = self.negword
|
|
46
|
+
else:
|
|
47
|
+
ret = ""
|
|
48
|
+
|
|
49
|
+
if '.' in n:
|
|
50
|
+
left, right = n.split('.', 1)
|
|
51
|
+
ret += self._int_to_word(int(left)) + " " + self.pointword + " "
|
|
52
|
+
for digit in right:
|
|
53
|
+
ret += self._int_to_word(int(digit)) + " "
|
|
54
|
+
return ret.strip()
|
|
55
|
+
else:
|
|
56
|
+
return (ret + self._int_to_word(int(n))).strip()
|
|
57
|
+
|
|
58
|
+
def _int_to_word(self, number):
|
|
59
|
+
"""Convert an integer to its word representation in Maltese."""
|
|
60
|
+
if number == 0:
|
|
61
|
+
return self.ones[0] if self.ones[0] else "zero"
|
|
62
|
+
|
|
63
|
+
if number < 0:
|
|
64
|
+
return self.negword + self._int_to_word(abs(number))
|
|
65
|
+
elif number < 10:
|
|
66
|
+
return self.ones[number]
|
|
67
|
+
elif number < 100:
|
|
68
|
+
tens_val = number // 10
|
|
69
|
+
ones_val = number % 10
|
|
70
|
+
if ones_val == 0:
|
|
71
|
+
return self.tens[tens_val]
|
|
72
|
+
else:
|
|
73
|
+
return self.tens[tens_val] + " " + self.ones[ones_val]
|
|
74
|
+
elif number < 1000:
|
|
75
|
+
hundreds_val = number // 100
|
|
76
|
+
remainder = number % 100
|
|
77
|
+
result = self.ones[hundreds_val] + " " + self.hundred
|
|
78
|
+
if remainder:
|
|
79
|
+
result += " " + self._int_to_word(remainder)
|
|
80
|
+
return result
|
|
81
|
+
elif number < 1000000:
|
|
82
|
+
thousands_val = number // 1000
|
|
83
|
+
remainder = number % 1000
|
|
84
|
+
result = self._int_to_word(thousands_val) + " " + self.thousand
|
|
85
|
+
if remainder:
|
|
86
|
+
result += " " + self._int_to_word(remainder)
|
|
87
|
+
return result
|
|
88
|
+
elif number < 1000000000:
|
|
89
|
+
millions_val = number // 1000000
|
|
90
|
+
remainder = number % 1000000
|
|
91
|
+
result = self._int_to_word(millions_val) + " " + self.million
|
|
92
|
+
if remainder:
|
|
93
|
+
result += " " + self._int_to_word(remainder)
|
|
94
|
+
return result
|
|
95
|
+
else:
|
|
96
|
+
return str(number) # Fallback for very large numbers
|
|
97
|
+
|
|
98
|
+
def to_ordinal(self, number):
|
|
99
|
+
"""Convert to ordinal in Maltese.
|
|
100
|
+
|
|
101
|
+
Maltese ordinals have specific forms for each number.
|
|
102
|
+
"""
|
|
103
|
+
if number == 1:
|
|
104
|
+
return "l-ewwel" # first
|
|
105
|
+
elif number == 2:
|
|
106
|
+
return "it-tieni" # second
|
|
107
|
+
elif number == 3:
|
|
108
|
+
return "it-tielet" # third
|
|
109
|
+
elif number == 4:
|
|
110
|
+
return "ir-raba'" # fourth
|
|
111
|
+
elif number == 5:
|
|
112
|
+
return "il-ħames" # fifth
|
|
113
|
+
elif number == 6:
|
|
114
|
+
return "is-sitt" # sixth
|
|
115
|
+
elif number == 7:
|
|
116
|
+
return "is-seba'" # seventh
|
|
117
|
+
elif number == 8:
|
|
118
|
+
return "it-tmien" # eighth
|
|
119
|
+
elif number == 9:
|
|
120
|
+
return "id-disa'" # ninth
|
|
121
|
+
elif number == 10:
|
|
122
|
+
return "l-għaxar" # tenth
|
|
123
|
+
else:
|
|
124
|
+
# For larger numbers, use "l-" prefix + cardinal
|
|
125
|
+
cardinal = self.to_cardinal(number)
|
|
126
|
+
return "l-" + cardinal
|
|
127
|
+
|
|
128
|
+
def to_ordinal_num(self, number):
|
|
129
|
+
"""Convert to abbreviated ordinal."""
|
|
130
|
+
return str(number) + "."
|
|
131
|
+
|
|
132
|
+
def to_year(self, val, longval=True):
|
|
133
|
+
"""Convert to year in Maltese."""
|
|
134
|
+
return self.to_cardinal(val)
|
|
135
|
+
|
|
136
|
+
def to_currency(self, val, currency='EUR', cents=True, separator=' ', adjective=False):
|
|
137
|
+
"""Convert to currency in Maltese."""
|
|
138
|
+
is_negative = False
|
|
139
|
+
if val < 0:
|
|
140
|
+
is_negative = True
|
|
141
|
+
val = abs(val)
|
|
142
|
+
|
|
143
|
+
parts = str(val).split('.')
|
|
144
|
+
left = int(parts[0]) if parts[0] else 0
|
|
145
|
+
right = int(parts[1][:2].ljust(2, '0')) if len(parts) > 1 and parts[1] else 0
|
|
146
|
+
|
|
147
|
+
cr1, cr2 = self.CURRENCY_FORMS.get(currency, list(self.CURRENCY_FORMS.values())[0])
|
|
148
|
+
|
|
149
|
+
left_str = self._int_to_word(left)
|
|
150
|
+
result = left_str + " " + (cr1[1] if left != 1 else cr1[0])
|
|
151
|
+
|
|
152
|
+
if cents and right:
|
|
153
|
+
cents_str = self._int_to_word(right)
|
|
154
|
+
result += separator + cents_str + " " + (cr2[1] if right != 1 else cr2[0])
|
|
155
|
+
|
|
156
|
+
if is_negative:
|
|
157
|
+
result = self.negword + result
|
|
158
|
+
|
|
159
|
+
return result.strip()
|
num2words2/lang_MY.py
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
from __future__ import unicode_literals
|
|
3
|
+
|
|
4
|
+
from .base import Num2Word_Base
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Num2Word_MY(Num2Word_Base):
|
|
8
|
+
"""Myanmar/Burmese language number to words conversion."""
|
|
9
|
+
|
|
10
|
+
CURRENCY_FORMS = {
|
|
11
|
+
'MMK': (('ကျပ်', 'ကျပ်'), ('ပြား', 'ပြား')),
|
|
12
|
+
'USD': (('ဒေါ်လာ', 'ဒေါ်လာ'), ('ဆင့်', 'ဆင့်')),
|
|
13
|
+
'EUR': (('ယူရို', 'ယူရို'), ('ဆင့်', 'ဆင့်')),
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
def setup(self):
|
|
17
|
+
self.negword = "အနုတ် "
|
|
18
|
+
self.pointword = "ဒသမ"
|
|
19
|
+
|
|
20
|
+
# Myanmar numbers 0-9
|
|
21
|
+
self.ones = [
|
|
22
|
+
'သုည', # 0
|
|
23
|
+
'တစ်', # 1
|
|
24
|
+
'နှစ်', # 2
|
|
25
|
+
'သုံး', # 3
|
|
26
|
+
'လေး', # 4
|
|
27
|
+
'ငါး', # 5
|
|
28
|
+
'ခြောက်', # 6
|
|
29
|
+
'ခုနစ်', # 7
|
|
30
|
+
'ရှစ်', # 8
|
|
31
|
+
'ကိုး', # 9
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
def to_cardinal(self, number):
|
|
35
|
+
"""Convert a number to its word representation in Myanmar."""
|
|
36
|
+
n = str(number).strip()
|
|
37
|
+
|
|
38
|
+
if n.startswith('-'):
|
|
39
|
+
n = n[1:]
|
|
40
|
+
ret = self.negword
|
|
41
|
+
else:
|
|
42
|
+
ret = ""
|
|
43
|
+
|
|
44
|
+
if '.' in n:
|
|
45
|
+
left, right = n.split('.', 1)
|
|
46
|
+
ret += self._int_to_word(int(left)) + " " + self.pointword + " "
|
|
47
|
+
for digit in right:
|
|
48
|
+
ret += self._int_to_word(int(digit)) + " "
|
|
49
|
+
return ret.strip()
|
|
50
|
+
else:
|
|
51
|
+
return (ret + self._int_to_word(int(n))).strip()
|
|
52
|
+
|
|
53
|
+
def _int_to_word(self, number):
|
|
54
|
+
"""Convert an integer to its word representation in Myanmar."""
|
|
55
|
+
if number == 0:
|
|
56
|
+
return self.ones[0]
|
|
57
|
+
|
|
58
|
+
if number < 0:
|
|
59
|
+
return self.negword + self._int_to_word(abs(number))
|
|
60
|
+
elif number < 10:
|
|
61
|
+
return self.ones[number]
|
|
62
|
+
elif number == 10:
|
|
63
|
+
return "တစ်ဆယ်"
|
|
64
|
+
elif number < 20:
|
|
65
|
+
return "တစ်ဆယ့်" + self.ones[number - 10]
|
|
66
|
+
elif number < 100:
|
|
67
|
+
tens_val = number // 10
|
|
68
|
+
ones_val = number % 10
|
|
69
|
+
tens_word = self.ones[tens_val] + "ဆယ်"
|
|
70
|
+
if ones_val == 0:
|
|
71
|
+
return tens_word
|
|
72
|
+
else:
|
|
73
|
+
return tens_word + "့" + self.ones[ones_val]
|
|
74
|
+
elif number < 1000:
|
|
75
|
+
hundreds_val = number // 100
|
|
76
|
+
remainder = number % 100
|
|
77
|
+
result = self.ones[hundreds_val] + "ရာ" # hundred
|
|
78
|
+
if remainder:
|
|
79
|
+
result += "့" + self._int_to_word(remainder)
|
|
80
|
+
return result
|
|
81
|
+
elif number < 10000:
|
|
82
|
+
thousands_val = number // 1000
|
|
83
|
+
remainder = number % 1000
|
|
84
|
+
result = self.ones[thousands_val] + "ထောင်" # thousand
|
|
85
|
+
if remainder:
|
|
86
|
+
result += "့" + self._int_to_word(remainder)
|
|
87
|
+
return result
|
|
88
|
+
elif number < 100000:
|
|
89
|
+
ten_thousands_val = number // 10000
|
|
90
|
+
remainder = number % 10000
|
|
91
|
+
result = self.ones[ten_thousands_val] + "သောင်း" # ten thousand
|
|
92
|
+
if remainder:
|
|
93
|
+
result += " " + self._int_to_word(remainder)
|
|
94
|
+
return result
|
|
95
|
+
elif number < 1000000:
|
|
96
|
+
hundred_thousands_val = number // 100000
|
|
97
|
+
remainder = number % 100000
|
|
98
|
+
result = self.ones[hundred_thousands_val] + "သိန်း" # hundred thousand
|
|
99
|
+
if remainder:
|
|
100
|
+
result += " " + self._int_to_word(remainder)
|
|
101
|
+
return result
|
|
102
|
+
elif number < 10000000:
|
|
103
|
+
millions_val = number // 1000000
|
|
104
|
+
remainder = number % 1000000
|
|
105
|
+
result = self.ones[millions_val] + "သန်း" # million
|
|
106
|
+
if remainder:
|
|
107
|
+
result += " " + self._int_to_word(remainder)
|
|
108
|
+
return result
|
|
109
|
+
elif number < 1000000000:
|
|
110
|
+
ten_millions_val = number // 10000000
|
|
111
|
+
remainder = number % 10000000
|
|
112
|
+
result = self._int_to_word(ten_millions_val) + " ကုဋေ" # ten million
|
|
113
|
+
if remainder:
|
|
114
|
+
result += " " + self._int_to_word(remainder)
|
|
115
|
+
return result
|
|
116
|
+
else:
|
|
117
|
+
return str(number) # Fallback for very large numbers
|
|
118
|
+
|
|
119
|
+
def to_ordinal(self, number):
|
|
120
|
+
"""Convert to ordinal in Myanmar."""
|
|
121
|
+
cardinal = self.to_cardinal(number)
|
|
122
|
+
return cardinal + "မြောက်" # ordinal suffix
|
|
123
|
+
|
|
124
|
+
def to_ordinal_num(self, number):
|
|
125
|
+
"""Convert to abbreviated ordinal."""
|
|
126
|
+
return str(number) + "မြောက်"
|
|
127
|
+
|
|
128
|
+
def to_year(self, val, longval=True):
|
|
129
|
+
"""Convert to year in Myanmar."""
|
|
130
|
+
return self.to_cardinal(val) + " ခုနှစ်"
|
|
131
|
+
|
|
132
|
+
def to_currency(self, val, currency='MMK', cents=True, separator=' ', adjective=False):
|
|
133
|
+
"""Convert to currency in Myanmar."""
|
|
134
|
+
is_negative = False
|
|
135
|
+
if val < 0:
|
|
136
|
+
is_negative = True
|
|
137
|
+
val = abs(val)
|
|
138
|
+
|
|
139
|
+
parts = str(val).split('.')
|
|
140
|
+
left = int(parts[0]) if parts[0] else 0
|
|
141
|
+
right = int(parts[1][:2].ljust(2, '0')) if len(parts) > 1 and parts[1] else 0
|
|
142
|
+
|
|
143
|
+
cr1, cr2 = self.CURRENCY_FORMS.get(currency, self.CURRENCY_FORMS['MMK'])
|
|
144
|
+
|
|
145
|
+
left_str = self._int_to_word(left)
|
|
146
|
+
result = left_str + " " + cr1[0]
|
|
147
|
+
|
|
148
|
+
if cents and right:
|
|
149
|
+
cents_str = self._int_to_word(right)
|
|
150
|
+
result += separator + cents_str + " " + cr2[0]
|
|
151
|
+
|
|
152
|
+
return (self.negword if is_negative else "") + result
|