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_JA.py ADDED
@@ -0,0 +1,615 @@
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 division, print_function, unicode_literals
19
+
20
+ from decimal import Decimal
21
+
22
+ from .base import Num2Word_Base
23
+ from .compat import strtype, to_s
24
+ from .currency import parse_currency_parts, prefix_currency
25
+
26
+
27
+ def select_text(text, reading=False, prefer=None):
28
+ """Select the correct text from the Japanese number, reading and
29
+ alternatives"""
30
+ # select kanji number or kana reading
31
+ if reading:
32
+ text = text[1]
33
+ else:
34
+ text = text[0]
35
+
36
+ # select the preferred one or the first one from multiple alternatives
37
+ if not isinstance(text, strtype):
38
+ common = set(text) & set(prefer or set())
39
+ if len(common) == 1:
40
+ text = common.pop()
41
+ else:
42
+ text = text[0]
43
+
44
+ return text
45
+
46
+
47
+ def rendaku_merge_pairs(lpair, rpair):
48
+ """Merge lpair < rpair while applying semi-irregular rendaku rules"""
49
+ ltext, lnum = lpair
50
+ rtext, rnum = rpair
51
+ if lnum > rnum:
52
+ raise ValueError
53
+
54
+ if rpair == ("ひゃく", 100):
55
+ if lpair == ("さん", 3):
56
+ rtext = "びゃく"
57
+ elif lpair == ("ろく", 6):
58
+ ltext = "ろっ"
59
+ rtext = "ぴゃく"
60
+ elif lpair == ("はち", 8):
61
+ ltext = "はっ"
62
+ rtext = "ぴゃく"
63
+ elif rpair == ("せん", 1000):
64
+ if lpair == ("さん", 3):
65
+ rtext = "ぜん"
66
+ elif lpair == ("はち", 8):
67
+ ltext = "はっ"
68
+ elif rpair == ("ちょう", 10**12):
69
+ if lpair == ("いち", 1):
70
+ ltext = "いっ"
71
+ elif lpair == ("はち", 8):
72
+ ltext = "はっ"
73
+ elif lpair == ("じゅう", 10):
74
+ ltext = "じゅっ"
75
+ elif rpair == ("けい", 10**16):
76
+ if lpair == ("いち", 1):
77
+ ltext = "いっ"
78
+ elif lpair == ("ろく", 6):
79
+ ltext = "ろっ"
80
+ elif lpair == ("はち", 8):
81
+ ltext = "はっ"
82
+ elif lpair == ("じゅう", 10):
83
+ ltext = "じゅっ"
84
+ elif lpair == ("ひゃく", 100):
85
+ ltext = "ひゃっ"
86
+
87
+ return ("%s%s" % (ltext, rtext), lnum * rnum)
88
+
89
+
90
+ # Source: https://www.sljfaq.org/afaq/era-list.html
91
+ # if there are multiple eras for the same year, use the last one
92
+ ERA_START = [
93
+ (645, ("大化", "たいか")),
94
+ (650, ("白雉", "はくち")),
95
+ (686, ("朱鳥", "しゅちょう")),
96
+ (701, ("大宝", "たいほう")),
97
+ (704, ("慶雲", "けいうん")),
98
+ (708, ("和銅", "わどう")),
99
+ (715, ("霊亀", "れいき")),
100
+ (717, ("養老", "ようろう")),
101
+ (724, ("神亀", "じんき")),
102
+ (729, ("天平", "てんぴょう")),
103
+ (749, ("天平感宝", "てんぴょうかんぽう")),
104
+ (749, ("天平勝宝", "てんぴょうしょうほう")),
105
+ (757, ("天平宝字", "てんぴょうじょうじ")),
106
+ (765, ("天平神護", "てんぴょうじんご")),
107
+ (767, ("神護景雲", "じんごけいうん")),
108
+ (770, ("宝亀", "ほうき")),
109
+ (781, ("天応", "てんおう")),
110
+ (782, ("延暦", "えんりゃく")),
111
+ (806, ("大同", "だいどう")),
112
+ (810, ("弘仁", "こうにん")),
113
+ (823, ("天長", "てんちょう")),
114
+ (834, ("承和", "じょうわ")),
115
+ (848, ("嘉祥", "かしょう")),
116
+ (851, ("仁寿", "にんじゅ")),
117
+ (855, ("斉衡", "さいこう")),
118
+ (857, ("天安", "てんあん")),
119
+ (859, ("貞観", "じょうがん")),
120
+ (877, ("元慶", "がんぎょう")),
121
+ (885, ("仁和", "にんな")),
122
+ (889, ("寛平", "かんぴょう")),
123
+ (898, ("昌泰", "しょうたい")),
124
+ (901, ("延喜", "えんぎ")),
125
+ (923, ("延長", "えんちょう")),
126
+ (931, ("承平", "じょうへい")),
127
+ (938, ("天慶", "てんぎょう")),
128
+ (947, ("天暦", "てんりゃく")),
129
+ (957, ("天徳", "てんとく")),
130
+ (961, ("応和", "おうわ")),
131
+ (964, ("康保", "こうほう")),
132
+ (968, ("安和", "あんな")),
133
+ (970, ("天禄", "てんろく")),
134
+ (974, ("天延", "てんえん")),
135
+ (976, ("貞元", "じょうげん")),
136
+ (979, ("天元", "てんげん")),
137
+ (983, ("永観", "えいかん")),
138
+ (985, ("寛和", "かんな")),
139
+ (987, ("永延", "えいえん")),
140
+ (989, ("永祚", "えいそ")),
141
+ (990, ("正暦", "しょうりゃく")),
142
+ (995, ("長徳", "ちょうとく")),
143
+ (999, ("長保", "ちょうほう")),
144
+ (1004, ("寛弘", "かんこう")),
145
+ (1013, ("長和", "ちょうわ")),
146
+ (1017, ("寛仁", "かんにん")),
147
+ (1021, ("治安", "じあん")),
148
+ (1024, ("万寿", "まんじゅ")),
149
+ (1028, ("長元", "ちょうげん")),
150
+ (1037, ("長暦", "ちょうりゃく")),
151
+ (1040, ("長久", "ちょうきゅう")),
152
+ (1045, ("寛徳", "かんとく")),
153
+ (1046, ("永承", "えいしょう")),
154
+ (1053, ("天喜", "てんぎ")),
155
+ (1058, ("康平", "こうへい")),
156
+ (1065, ("治暦", "じりゃく")),
157
+ (1069, ("延久", "えんきゅう")),
158
+ (1074, ("承保", "じょうほう")),
159
+ (1078, ("承暦", "じょうりゃく")),
160
+ (1081, ("永保", "えいほう")),
161
+ (1084, ("応徳", "おうとく")),
162
+ (1087, ("寛治", "かんじ")),
163
+ (1095, ("嘉保", "かほう")),
164
+ (1097, ("永長", "えいちょう")),
165
+ (1098, ("承徳", "じょうとく")),
166
+ (1099, ("康和", "こうわ")),
167
+ (1104, ("長治", "ちょうじ")),
168
+ (1106, ("嘉承", "かじょう")),
169
+ (1108, ("天仁", "てんにん")),
170
+ (1110, ("天永", "てんねい")),
171
+ (1113, ("永久", "えいきゅう")),
172
+ (1118, ("元永", "げんえい")),
173
+ (1120, ("保安", "ほうあん")),
174
+ (1124, ("天治", "てんじ")),
175
+ (1126, ("大治", "だいじ")),
176
+ (1131, ("天承", "てんしょう")),
177
+ (1132, ("長承", "ちょうしょう")),
178
+ (1135, ("保延", "ほうえん")),
179
+ (1141, ("永治", "えいじ")),
180
+ (1142, ("康治", "こうじ")),
181
+ (1144, ("天養", "てんよう")),
182
+ (1145, ("久安", "きゅうあん")),
183
+ (1151, ("仁平", "にんぺい")),
184
+ (1154, ("久寿", "きゅうじゅ")),
185
+ (1156, ("保元", "ほうげん")),
186
+ (1159, ("平治", "へいじ")),
187
+ (1160, ("永暦", "えいりゃく")),
188
+ (1161, ("応保", "おうほう")),
189
+ (1163, ("長寛", "ちょうかん")),
190
+ (1165, ("永万", "えいまん")),
191
+ (1166, ("仁安", "にんあん")),
192
+ (1169, ("嘉応", "かおう")),
193
+ (1171, ("承安", "しょうあん")),
194
+ (1175, ("安元", "あんげん")),
195
+ (1177, ("治承", "じしょう")),
196
+ (1181, ("養和", "ようわ")),
197
+ (1182, ("寿永", "じゅえい")),
198
+ (1184, ("元暦", "げんりゃく")),
199
+ (1185, ("文治", "ぶんじ")),
200
+ (1190, ("建久", "けんきゅう")),
201
+ (1199, ("正治", "しょうじ")),
202
+ (1201, ("建仁", "けんにん")),
203
+ (1204, ("元久", "げんきゅう")),
204
+ (1206, ("建永", "けんえい")),
205
+ (1207, ("承元", "じょうげん")),
206
+ (1211, ("建暦", "けんりゃく")),
207
+ (1214, ("建保", "けんぽう")),
208
+ (1219, ("承久", "じょうきゅう")),
209
+ (1222, ("貞応", "じょうおう")),
210
+ (1225, ("元仁", "げんにん")),
211
+ (1225, ("嘉禄", "かろく")),
212
+ (1228, ("安貞", "あんてい")),
213
+ (1229, ("寛喜", "かんき")),
214
+ (1232, ("貞永", "じょうえい")),
215
+ (1233, ("天福", "てんぷく")),
216
+ (1235, ("文暦", "ぶんりゃく")),
217
+ (1235, ("嘉禎", "かてい")),
218
+ (1239, ("暦仁", "りゃくにん")),
219
+ (1239, ("延応", "えんおう")),
220
+ (1240, ("仁治", "にんじ")),
221
+ (1243, ("寛元", "かんげん")),
222
+ (1247, ("宝治", "ほうじ")),
223
+ (1249, ("建長", "けんちょう")),
224
+ (1256, ("康元", "こうげん")),
225
+ (1257, ("正嘉", "しょうか")),
226
+ (1259, ("正元", "しょうげん")),
227
+ (1260, ("文応", "ぶんおう")),
228
+ (1261, ("弘長", "こうちょう")),
229
+ (1264, ("文永", "ぶんえい")),
230
+ (1275, ("健治", "けんじ")),
231
+ (1278, ("弘安", "こうあん")),
232
+ (1288, ("正応", "しょうおう")),
233
+ (1293, ("永仁", "えいにん")),
234
+ (1299, ("正安", "しょうあん")),
235
+ (1303, ("乾元", "けんげん")),
236
+ (1303, ("嘉元", "かげん")),
237
+ (1307, ("徳治", "とくじ")),
238
+ (1308, ("延慶", "えんきょう")),
239
+ (1311, ("応長", "おうちょう")),
240
+ (1312, ("正和", "しょうわ")),
241
+ (1317, ("文保", "ぶんぽう")),
242
+ (1319, ("元応", "げんおう")),
243
+ (1321, ("元亨", "げんこう")),
244
+ (1325, ("正中", "しょうちゅ")),
245
+ (1326, ("嘉暦", "かりゃく")),
246
+ (1329, ("元徳", "げんとく")),
247
+ (1331, ("元弘", "げんこう")),
248
+ (1332, ("正慶", "しょうけい")),
249
+ (1334, ("建武", "けんむ")),
250
+ (1336, ("延元", "えいげん")),
251
+ (1338, ("暦応", "りゃくおう")),
252
+ (1340, ("興国", "こうこく")),
253
+ (1342, ("康永", "こうえい")),
254
+ (1345, ("貞和", "じょうわ")),
255
+ (1347, ("正平", "しょうへい")),
256
+ (1350, ("観応", "かんおう")),
257
+ (1352, ("文和", "ぶんな")),
258
+ (1356, ("延文", "えんぶん")),
259
+ (1361, ("康安", "こうあん")),
260
+ (1362, ("貞治", "じょうじ")),
261
+ (1368, ("応安", "おうあん")),
262
+ (1370, ("建徳", "けんとく")),
263
+ (1372, ("文中", "ぶんちゅう")),
264
+ (1375, ("永和", "えいわ")),
265
+ (1375, ("天授", "てんじゅ")),
266
+ (1379, ("康暦", "こうりゃく")),
267
+ (1381, ("永徳", "えいとく")),
268
+ (1381, ("弘和", "こうわ")),
269
+ (1384, ("至徳", "しとく")),
270
+ (1384, ("元中", "げんちゅう")),
271
+ (1387, ("嘉慶", "かけい")),
272
+ (1389, ("康応", "こうおう")),
273
+ (1390, ("明徳", "めいとく")),
274
+ (1394, ("応永", "おうえい")),
275
+ (1428, ("正長", "しょうちょう")),
276
+ (1429, ("永享", "えいきょう")),
277
+ (1441, ("嘉吉", "かきつ")),
278
+ (1444, ("文安", "ぶんあん")),
279
+ (1449, ("宝徳", "ほうとく")),
280
+ (1452, ("享徳", "きょうとく")),
281
+ (1455, ("康正", "こうしょう")),
282
+ (1457, ("長禄", "ちょうろく")),
283
+ (1461, ("寛正", "かんしょう")),
284
+ (1466, ("文正", "ぶんしょう")),
285
+ (1467, ("応仁", "おうにん")),
286
+ (1469, ("文明", "ぶんめい")),
287
+ (1487, ("長享", "ちょうきょう")),
288
+ (1489, ("延徳", "えんとく")),
289
+ (1492, ("明応", "めいおう")),
290
+ (1501, ("文亀", "ぶんき")),
291
+ (1504, ("永正", "えいしょう")),
292
+ (1521, ("大永", "だいえい")),
293
+ (1528, ("享禄", "きょうろく")),
294
+ (1532, ("天文", "てんぶん")),
295
+ (1555, ("弘治", "こうじ")),
296
+ (1558, ("永禄", "えいろく")),
297
+ (1570, ("元亀", "げんき")),
298
+ (1573, ("天正", "てんしょう")),
299
+ (1593, ("文禄", "ぶんろく")),
300
+ (1596, ("慶長", "けいちょう")),
301
+ (1615, ("元和", "げんな")),
302
+ (1624, ("寛永", "かんえい")),
303
+ (1645, ("正保", "しょうほう")),
304
+ (1648, ("慶安", "けいあん")),
305
+ (1652, ("承応", "じょうおう")),
306
+ (1655, ("明暦", "めいれき")),
307
+ (1658, ("万治", "まんじ")),
308
+ (1661, ("寛文", "かんぶん")),
309
+ (1673, ("延宝", "えんぽう")),
310
+ (1681, ("天和", "てんな")),
311
+ (1684, ("貞享", "じょうきょう")),
312
+ (1688, ("元禄", "げんろく")),
313
+ (1704, ("宝永", "ほうえい")),
314
+ (1711, ("正徳", "しょうとく")),
315
+ (1716, ("享保", "きょうほう")),
316
+ (1736, ("元文", "げんぶん")),
317
+ (1741, ("寛保", "かんぽう")),
318
+ (1744, ("延享", "えんきょう")),
319
+ (1748, ("寛延", "かんえん")),
320
+ (1751, ("宝暦", "ほうれき")),
321
+ (1764, ("明和", "めいわ")),
322
+ (1773, ("安永", "あんえい")),
323
+ (1781, ("天明", "てんめい")),
324
+ (1801, ("寛政", "かんせい")),
325
+ (1802, ("享和", "きょうわ")),
326
+ (1804, ("文化", "ぶんか")),
327
+ (1818, ("文政", "ぶんせい")),
328
+ (1831, ("天保", "てんぽう")),
329
+ (1845, ("弘化", "こうか")),
330
+ (1848, ("嘉永", "かえい")),
331
+ (1855, ("安政", "あんせい")),
332
+ (1860, ("万延", "まんえい")),
333
+ (1861, ("文久", "ぶんきゅう")),
334
+ (1864, ("元治", "げんじ")),
335
+ (1865, ("慶応", "けいおう")),
336
+ (1868, ("明治", "めいじ")),
337
+ (1912, ("大正", "たいしょう")),
338
+ (1926, ("昭和", "しょうわ")),
339
+ (1989, ("平成", "へいせい")),
340
+ (2019, ("令和", "れいわ")),
341
+ ]
342
+
343
+
344
+ class Num2Word_JA(Num2Word_Base):
345
+ CURRENCY_FORMS = {
346
+ 'JPY': (('円', 'えん'), ('銭', '銭')), # Adding sen (1/100 yen) support
347
+ 'EUR': (('ユーロ', 'ユーロ'), ('セント', 'セント')),
348
+ 'USD': (('ドル', 'ドル'), ('セント', 'セント')),
349
+ 'GBP': (('ポンド', 'ポンド'), ('ペンス', 'ペンス')),
350
+ 'CNY': (('元', '元'), ('分', '分')), # Chinese yuan with fen (1/100 yuan)
351
+ }
352
+
353
+ def set_high_numwords(self, high):
354
+ max = 4 * len(high)
355
+ for word, n in zip(high, range(max, 0, -4)):
356
+ self.cards[10 ** n] = word
357
+
358
+ def setup(self):
359
+ self.negword = "マイナス"
360
+ self.pointword = ("点", "てん")
361
+ self.exclude_title = ["点", "マイナス"]
362
+
363
+ self.high_numwords = [
364
+ ("万", "まん"), # 10**4 man
365
+ ("億", "おく"), # 10**8 oku
366
+ ("兆", "ちょう"), # 10**12 chō
367
+ ("京", "けい"), # 10**16 kei
368
+ ("垓", "がい"), # 10**20 gai
369
+ ("秭", "し"), # 10**24 shi
370
+ ("穣", "じょう"), # 10**28 jō
371
+ ("溝", "こう"), # 10**32 kō
372
+ ("澗", "かん"), # 10**36 kan
373
+ ("正", "せい"), # 10**40 sei
374
+ ("載", "さい"), # 10**44 sai
375
+ ("極", "ごく"), # 10**48 goku
376
+ ]
377
+
378
+ self.high_numwords.reverse()
379
+
380
+ self.mid_numwords = [
381
+ (1000, ("千", "せん")),
382
+ (100, ("百", "ひゃく")),
383
+ ]
384
+
385
+ self.low_numwords = [
386
+ ("十", "じゅう"), # 10 jū
387
+ ("九", "きゅう"), # 9 kyū
388
+ ("八", "はち"), # 8 hachi
389
+ ("七", ("なな", "しち")), # 7 nana, shichi
390
+ ("六", "ろく"), # 6 roku
391
+ ("五", "ご"), # 5 go
392
+ ("四", ("よん", "し")), # 4 yon, shi
393
+ ("三", "さん"), # 3 san
394
+ ("二", "に"), # 2 ni
395
+ ("一", "いち"), # 1 ichi
396
+ # both are alternatives, 零 doesn't map to ゼロ or 〇 to れい
397
+ (("零", "〇"), ("ゼロ", "れい")), # 0 ZERO, rei
398
+ ]
399
+
400
+ def merge(self, lpair, rpair):
401
+ ltext, lnum = lpair
402
+ rtext, rnum = rpair
403
+
404
+ fmt = "%s%s"
405
+ # ignore lpair if lnum is 1 and rnum is less than 10000
406
+ if lnum == 1 and rnum < 10000:
407
+ return rpair
408
+ # rnum is added to lnum
409
+ elif lnum > rnum:
410
+ return (fmt % (ltext, rtext), lnum + rnum)
411
+ # rnum is multiplied by lnum
412
+ elif lnum < rnum:
413
+ return rendaku_merge_pairs(lpair, rpair)
414
+
415
+ def _ordinal_suffix(self, reading, counter):
416
+ if reading:
417
+ if counter == "番":
418
+ return "ばんめ"
419
+ else:
420
+ raise NotImplementedError(
421
+ "Reading not implemented for %s" % counter)
422
+ else:
423
+ return counter + "目"
424
+
425
+ def to_ordinal(self, value, reading=False, prefer=None, counter="番"):
426
+ self.verify_ordinal(value)
427
+ base = self.to_cardinal(value, reading=reading, prefer=prefer)
428
+ return "%s%s" % (base, self._ordinal_suffix(reading, counter))
429
+
430
+ def to_ordinal_num(self, value, reading=False, counter="番"):
431
+ return "%s%s" % (value, self._ordinal_suffix(reading, counter))
432
+
433
+ def to_year(self, val, suffix=None, longval=True, reading=False,
434
+ prefer=None, era=True):
435
+ year = val
436
+ # Gregorian calendar
437
+ if not era:
438
+ prefix = ""
439
+ if year < 0:
440
+ year = abs(year)
441
+ prefix = "きげんぜん" if reading else "紀元前"
442
+
443
+ year_words = self.to_cardinal(year, reading=reading, prefer=prefer)
444
+ if reading and year % 10 == 9:
445
+ year_words = year_words[:-3] + "く"
446
+
447
+ return "%s%s%s" % (prefix, year_words, "ねん" if reading else "年")
448
+
449
+ # Era calendar (default)
450
+ min_year = ERA_START[0][0]
451
+ last_era_idx = len(ERA_START) - 1
452
+ if year < min_year:
453
+ raise ValueError(
454
+ "Can't convert years less than %s to era" % min_year)
455
+
456
+ first = 0
457
+ last = last_era_idx
458
+ era_idx = None
459
+ while era_idx is None:
460
+ mid = (first + last) // 2
461
+ if mid == last_era_idx or (ERA_START[mid][0] <= year and
462
+ ERA_START[mid + 1][0] > year):
463
+ era_idx = mid
464
+ # if an era lasting less than a year is preferred, choose it
465
+ if prefer:
466
+ i = mid - 1
467
+ while i >= 0 and ERA_START[i][0] == year:
468
+ # match kanji or hiragana
469
+ if set(ERA_START[i][1]) & set(prefer):
470
+ era_idx = i
471
+ break
472
+ i -= 1
473
+
474
+ # ends up at the last index where year >= ERA_START[mid][0]
475
+ if year < ERA_START[mid][0]:
476
+ last = mid - 1
477
+ else:
478
+ first = mid + 1
479
+
480
+ era = ERA_START[era_idx]
481
+ era_name = era[1][0]
482
+ era_year = year - era[0] + 1
483
+ fmt = "%s%s年"
484
+ if reading == "arabic":
485
+ era_year_words = str(era_year)
486
+ elif reading:
487
+ era_name = era[1][1]
488
+ era_year_words = (self.to_cardinal(era_year, reading=True,
489
+ prefer=prefer)
490
+ if era_year != 1 else "がん")
491
+ if era_year % 10 == 9:
492
+ era_year_words = era_year_words[:-3] + "く"
493
+ fmt = "%s%sねん"
494
+ else:
495
+ era_year_words = (self.to_cardinal(era_year, reading=False,
496
+ prefer=prefer)
497
+ if era_year != 1 else "元")
498
+
499
+ return fmt % (era_name, era_year_words)
500
+
501
+ def to_currency(self, val, currency="JPY", cents=False, separator="",
502
+ adjective=False, reading=False, prefer=None):
503
+ # Check if value has fractional cents
504
+ decimal_val = Decimal(str(val))
505
+ has_fractional_cents = (decimal_val * 100) % 1 != 0
506
+
507
+ # Convert integers to float to ensure currency format
508
+ if isinstance(val, int):
509
+ val = float(val)
510
+
511
+ left, right, is_negative = parse_currency_parts(
512
+ val, is_int_with_cents=cents)
513
+
514
+ try:
515
+ cr1, cr2 = self.CURRENCY_FORMS[currency]
516
+ if (cents or abs(val) != left) and not cr2:
517
+ raise ValueError('Decimals not supported for "%s"' % currency)
518
+ except KeyError:
519
+ raise NotImplementedError(
520
+ 'Currency code "%s" not implemented for "%s"' %
521
+ (currency, self.__class__.__name__))
522
+
523
+ if adjective and currency in self.CURRENCY_ADJECTIVES:
524
+ cr1 = prefix_currency(self.CURRENCY_ADJECTIVES[currency], cr1)
525
+
526
+ minus_str = self.negword if is_negative else ""
527
+
528
+ if has_fractional_cents and cr2:
529
+ # Handle fractional cents using to_cardinal_float
530
+ right_str = self.to_cardinal_float(right / 100.0, reading=reading, prefer=prefer)
531
+ cr2_str = (cr2[1] if reading else cr2[0]) if cr2 else ''
532
+ else:
533
+ # Handle normal integer cents
534
+ right_str = self.to_cardinal(right, reading=reading, prefer=prefer) if cr2 and right else ''
535
+ cr2_str = (cr2[1] if reading else cr2[0]) if (cr2 and right) else ''
536
+
537
+ return '%s%s%s%s%s' % (
538
+ minus_str,
539
+ self.to_cardinal(left, reading=reading, prefer=prefer),
540
+ cr1[1] if reading else cr1[0],
541
+ right_str,
542
+ cr2_str,
543
+ )
544
+
545
+ def splitnum(self, value, reading, prefer):
546
+ for elem in self.cards:
547
+ if elem > value:
548
+ continue
549
+
550
+ out = []
551
+ if value == 0:
552
+ div, mod = 1, 0
553
+ else:
554
+ div, mod = divmod(value, elem)
555
+
556
+ if div == 1:
557
+ out.append((select_text(self.cards[1], reading, prefer), 1))
558
+ else:
559
+ if div == value: # The system tallies, eg Roman Numerals
560
+ return [(
561
+ div * select_text(self.cards[elem], reading, prefer),
562
+ div * elem)]
563
+ out.append(self.splitnum(div, reading, prefer))
564
+
565
+ out.append((select_text(self.cards[elem], reading, prefer), elem))
566
+
567
+ if mod:
568
+ out.append(self.splitnum(mod, reading, prefer))
569
+
570
+ return out
571
+
572
+ def to_cardinal(self, value, reading=False, prefer=None):
573
+ try:
574
+ assert int(value) == value
575
+ except (ValueError, TypeError, AssertionError):
576
+ return self.to_cardinal_float(value, reading=reading,
577
+ prefer=prefer)
578
+
579
+ out = ""
580
+ if value < 0:
581
+ value = abs(value)
582
+ out = self.negword
583
+
584
+ if value >= self.MAXVAL:
585
+ raise OverflowError(self.errmsg_toobig % (value, self.MAXVAL))
586
+
587
+ val = self.splitnum(value, reading, prefer)
588
+ words, _ = self.clean(val)
589
+ return self.title(out + words)
590
+
591
+ def to_cardinal_float(self, value, reading=False, prefer=None):
592
+ prefer = prefer or ["れい"]
593
+ try:
594
+ float(value) == value
595
+ except (ValueError, TypeError, AssertionError):
596
+ raise TypeError(self.errmsg_nonnum % value)
597
+
598
+ pre, post = self.float2tuple(float(value))
599
+
600
+ post = str(post)
601
+ post = '0' * (self.precision - len(post)) + post
602
+
603
+ out = [self.to_cardinal(pre, reading=reading, prefer=prefer)]
604
+ # Handle negative decimals when integer part is 0
605
+ if value < 0 and pre == 0:
606
+ out = [self.negword.strip()] + out
607
+ if self.precision:
608
+ out.append(self.title(self.pointword[1 if reading else 0]))
609
+
610
+ for i in range(self.precision):
611
+ curr = int(post[i])
612
+ out.append(to_s(
613
+ self.to_cardinal(curr, reading=reading, prefer=prefer)))
614
+
615
+ return "".join(out)