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.
Files changed (133) hide show
  1. num2words2/README.md +69 -0
  2. num2words2/__init__.py +196 -0
  3. num2words2/_version.py +3 -0
  4. num2words2/base.py +377 -0
  5. num2words2/compat.py +29 -0
  6. num2words2/currency.py +60 -0
  7. num2words2/lang_AF.py +202 -0
  8. num2words2/lang_AM.py +193 -0
  9. num2words2/lang_AR.py +435 -0
  10. num2words2/lang_AS.py +119 -0
  11. num2words2/lang_AZ.py +208 -0
  12. num2words2/lang_BA.py +119 -0
  13. num2words2/lang_BE.py +356 -0
  14. num2words2/lang_BG.py +393 -0
  15. num2words2/lang_BN.py +242 -0
  16. num2words2/lang_BO.py +122 -0
  17. num2words2/lang_BR.py +135 -0
  18. num2words2/lang_BS.py +189 -0
  19. num2words2/lang_CA.py +476 -0
  20. num2words2/lang_CE.py +546 -0
  21. num2words2/lang_CS.py +260 -0
  22. num2words2/lang_CY.py +574 -0
  23. num2words2/lang_DA.py +170 -0
  24. num2words2/lang_DE.py +180 -0
  25. num2words2/lang_EL.py +338 -0
  26. num2words2/lang_EN.py +118 -0
  27. num2words2/lang_EN_IN.py +26 -0
  28. num2words2/lang_EN_NG.py +45 -0
  29. num2words2/lang_EO.py +130 -0
  30. num2words2/lang_ES.py +399 -0
  31. num2words2/lang_ES_CO.py +37 -0
  32. num2words2/lang_ES_CR.py +38 -0
  33. num2words2/lang_ES_GT.py +37 -0
  34. num2words2/lang_ES_NI.py +35 -0
  35. num2words2/lang_ES_VE.py +43 -0
  36. num2words2/lang_ET.py +393 -0
  37. num2words2/lang_EU.py +158 -0
  38. num2words2/lang_EUR.py +104 -0
  39. num2words2/lang_FA.py +187 -0
  40. num2words2/lang_FI.py +759 -0
  41. num2words2/lang_FO.py +136 -0
  42. num2words2/lang_FR.py +133 -0
  43. num2words2/lang_FR_BE.py +49 -0
  44. num2words2/lang_FR_CH.py +48 -0
  45. num2words2/lang_FR_DZ.py +35 -0
  46. num2words2/lang_GL.py +135 -0
  47. num2words2/lang_GU.py +172 -0
  48. num2words2/lang_HA.py +293 -0
  49. num2words2/lang_HAW.py +144 -0
  50. num2words2/lang_HE.py +314 -0
  51. num2words2/lang_HI.py +243 -0
  52. num2words2/lang_HR.py +304 -0
  53. num2words2/lang_HT.py +136 -0
  54. num2words2/lang_HU.py +189 -0
  55. num2words2/lang_HY.py +364 -0
  56. num2words2/lang_ID.py +242 -0
  57. num2words2/lang_IS.py +208 -0
  58. num2words2/lang_IT.py +265 -0
  59. num2words2/lang_JA.py +615 -0
  60. num2words2/lang_JW.py +136 -0
  61. num2words2/lang_KA.py +169 -0
  62. num2words2/lang_KK.py +136 -0
  63. num2words2/lang_KM.py +173 -0
  64. num2words2/lang_KN.py +182 -0
  65. num2words2/lang_KO.py +175 -0
  66. num2words2/lang_KZ.py +161 -0
  67. num2words2/lang_LA.py +135 -0
  68. num2words2/lang_LB.py +135 -0
  69. num2words2/lang_LN.py +136 -0
  70. num2words2/lang_LO.py +149 -0
  71. num2words2/lang_LT.py +283 -0
  72. num2words2/lang_LV.py +266 -0
  73. num2words2/lang_MG.py +143 -0
  74. num2words2/lang_MI.py +151 -0
  75. num2words2/lang_MK.py +136 -0
  76. num2words2/lang_ML.py +159 -0
  77. num2words2/lang_MN.py +319 -0
  78. num2words2/lang_MR.py +187 -0
  79. num2words2/lang_MS.py +293 -0
  80. num2words2/lang_MT.py +159 -0
  81. num2words2/lang_MY.py +152 -0
  82. num2words2/lang_NE.py +157 -0
  83. num2words2/lang_NL.py +204 -0
  84. num2words2/lang_NN.py +136 -0
  85. num2words2/lang_NO.py +143 -0
  86. num2words2/lang_OC.py +135 -0
  87. num2words2/lang_PA.py +159 -0
  88. num2words2/lang_PL.py +336 -0
  89. num2words2/lang_PS.py +136 -0
  90. num2words2/lang_PT.py +280 -0
  91. num2words2/lang_PT_BR.py +224 -0
  92. num2words2/lang_RO.py +183 -0
  93. num2words2/lang_RU.py +570 -0
  94. num2words2/lang_SA.py +136 -0
  95. num2words2/lang_SD.py +136 -0
  96. num2words2/lang_SI.py +152 -0
  97. num2words2/lang_SK.py +250 -0
  98. num2words2/lang_SL.py +306 -0
  99. num2words2/lang_SN.py +447 -0
  100. num2words2/lang_SO.py +136 -0
  101. num2words2/lang_SQ.py +252 -0
  102. num2words2/lang_SR.py +254 -0
  103. num2words2/lang_SU.py +136 -0
  104. num2words2/lang_SV.py +169 -0
  105. num2words2/lang_SW.py +219 -0
  106. num2words2/lang_TA.py +303 -0
  107. num2words2/lang_TE.py +169 -0
  108. num2words2/lang_TET.py +285 -0
  109. num2words2/lang_TG.py +149 -0
  110. num2words2/lang_TH.py +214 -0
  111. num2words2/lang_TK.py +136 -0
  112. num2words2/lang_TL.py +145 -0
  113. num2words2/lang_TR.py +882 -0
  114. num2words2/lang_TT.py +136 -0
  115. num2words2/lang_UK.py +1101 -0
  116. num2words2/lang_UR.py +168 -0
  117. num2words2/lang_UZ.py +136 -0
  118. num2words2/lang_VI.py +143 -0
  119. num2words2/lang_WO.py +136 -0
  120. num2words2/lang_YI.py +135 -0
  121. num2words2/lang_YO.py +136 -0
  122. num2words2/lang_ZH.py +296 -0
  123. num2words2/lang_ZH_CN.py +85 -0
  124. num2words2/lang_ZH_HK.py +48 -0
  125. num2words2/lang_ZH_TW.py +198 -0
  126. num2words2/utils.py +35 -0
  127. num2words2-0.1.0.dev1.data/scripts/num2words2 +98 -0
  128. num2words2-0.1.0.dev1.dist-info/METADATA +244 -0
  129. num2words2-0.1.0.dev1.dist-info/RECORD +133 -0
  130. num2words2-0.1.0.dev1.dist-info/WHEEL +5 -0
  131. num2words2-0.1.0.dev1.dist-info/entry_points.txt +2 -0
  132. num2words2-0.1.0.dev1.dist-info/licenses/COPYING +145 -0
  133. 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