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_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()