n2words 1.23.1 → 1.24.0

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 (317) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +181 -52
  3. package/dist/languages/ar.js +2 -0
  4. package/dist/languages/ar.js.map +1 -0
  5. package/dist/languages/az.js +2 -0
  6. package/dist/languages/az.js.map +1 -0
  7. package/dist/languages/bn.js +2 -0
  8. package/dist/languages/bn.js.map +1 -0
  9. package/dist/languages/cs.js +2 -0
  10. package/dist/languages/cs.js.map +1 -0
  11. package/dist/languages/da.js +2 -0
  12. package/dist/languages/da.js.map +1 -0
  13. package/dist/languages/de.js +2 -0
  14. package/dist/languages/de.js.map +1 -0
  15. package/dist/languages/el.js +2 -0
  16. package/dist/languages/el.js.map +1 -0
  17. package/dist/languages/en.js +2 -0
  18. package/dist/languages/en.js.map +1 -0
  19. package/dist/languages/es.js +2 -0
  20. package/dist/languages/es.js.map +1 -0
  21. package/dist/languages/fa.js +2 -0
  22. package/dist/languages/fa.js.map +1 -0
  23. package/dist/languages/fil.js +2 -0
  24. package/dist/languages/fil.js.map +1 -0
  25. package/dist/languages/fr-BE.js +2 -0
  26. package/dist/languages/fr-BE.js.map +1 -0
  27. package/dist/languages/fr.js +2 -0
  28. package/dist/languages/fr.js.map +1 -0
  29. package/dist/languages/gu.js +2 -0
  30. package/dist/languages/gu.js.map +1 -0
  31. package/dist/languages/he.js +2 -0
  32. package/dist/languages/he.js.map +1 -0
  33. package/dist/languages/hi.js +2 -0
  34. package/dist/languages/hi.js.map +1 -0
  35. package/dist/languages/hr.js +2 -0
  36. package/dist/languages/hr.js.map +1 -0
  37. package/dist/languages/hu.js +2 -0
  38. package/dist/languages/hu.js.map +1 -0
  39. package/dist/languages/id.js +2 -0
  40. package/dist/languages/id.js.map +1 -0
  41. package/dist/languages/it.js +2 -0
  42. package/dist/languages/it.js.map +1 -0
  43. package/dist/languages/ja.js +2 -0
  44. package/dist/languages/ja.js.map +1 -0
  45. package/dist/languages/kn.js +2 -0
  46. package/dist/languages/kn.js.map +1 -0
  47. package/dist/languages/ko.js +2 -0
  48. package/dist/languages/ko.js.map +1 -0
  49. package/dist/languages/lt.js +2 -0
  50. package/dist/languages/lt.js.map +1 -0
  51. package/dist/languages/lv.js +2 -0
  52. package/dist/languages/lv.js.map +1 -0
  53. package/dist/languages/mr.js +2 -0
  54. package/dist/languages/mr.js.map +1 -0
  55. package/dist/languages/ms.js +2 -0
  56. package/dist/languages/ms.js.map +1 -0
  57. package/dist/languages/nb.js +2 -0
  58. package/dist/languages/nb.js.map +1 -0
  59. package/dist/languages/nl.js +2 -0
  60. package/dist/languages/nl.js.map +1 -0
  61. package/dist/languages/pa-Guru.js +2 -0
  62. package/dist/languages/pa-Guru.js.map +1 -0
  63. package/dist/languages/pl.js +2 -0
  64. package/dist/languages/pl.js.map +1 -0
  65. package/dist/languages/pt.js +2 -0
  66. package/dist/languages/pt.js.map +1 -0
  67. package/dist/languages/ro.js +2 -0
  68. package/dist/languages/ro.js.map +1 -0
  69. package/dist/languages/ru.js +2 -0
  70. package/dist/languages/ru.js.map +1 -0
  71. package/dist/languages/sr-Latn.js +2 -0
  72. package/dist/languages/sr-Latn.js.map +1 -0
  73. package/dist/languages/sv.js +2 -0
  74. package/dist/languages/sv.js.map +1 -0
  75. package/dist/languages/sw.js +2 -0
  76. package/dist/languages/sw.js.map +1 -0
  77. package/dist/languages/ta.js +2 -0
  78. package/dist/languages/ta.js.map +1 -0
  79. package/dist/languages/te.js +2 -0
  80. package/dist/languages/te.js.map +1 -0
  81. package/dist/languages/th.js +2 -0
  82. package/dist/languages/th.js.map +1 -0
  83. package/dist/languages/tr.js +2 -0
  84. package/dist/languages/tr.js.map +1 -0
  85. package/dist/languages/uk.js +2 -0
  86. package/dist/languages/uk.js.map +1 -0
  87. package/dist/languages/ur.js +2 -0
  88. package/dist/languages/ur.js.map +1 -0
  89. package/dist/languages/vi.js +2 -0
  90. package/dist/languages/vi.js.map +1 -0
  91. package/dist/languages/zh-Hans.js +2 -0
  92. package/dist/languages/zh-Hans.js.map +1 -0
  93. package/dist/n2words.js +1 -1
  94. package/dist/n2words.js.map +1 -1
  95. package/lib/classes/abstract-language.js +211 -110
  96. package/lib/classes/greedy-scale-language.js +195 -0
  97. package/lib/classes/slavic-language.js +251 -0
  98. package/lib/classes/south-asian-language.js +161 -0
  99. package/lib/classes/turkic-language.js +63 -0
  100. package/lib/languages/ar.js +243 -0
  101. package/lib/languages/az.js +58 -0
  102. package/lib/languages/bn.js +126 -0
  103. package/lib/languages/cs.js +212 -0
  104. package/lib/languages/da.js +167 -0
  105. package/lib/languages/de.js +135 -0
  106. package/lib/languages/el.js +116 -0
  107. package/lib/languages/en.js +123 -0
  108. package/lib/languages/es.js +153 -0
  109. package/lib/languages/fa.js +127 -0
  110. package/lib/languages/fil.js +162 -0
  111. package/lib/languages/fr-BE.js +61 -0
  112. package/lib/languages/fr.js +145 -0
  113. package/lib/languages/gu.js +156 -0
  114. package/lib/languages/he.js +329 -0
  115. package/lib/languages/hi.js +126 -0
  116. package/lib/languages/hr.js +157 -0
  117. package/lib/languages/hu.js +155 -0
  118. package/lib/languages/id.js +174 -0
  119. package/lib/languages/it.js +148 -0
  120. package/lib/languages/ja.js +190 -0
  121. package/lib/languages/kn.js +71 -0
  122. package/lib/languages/ko.js +83 -0
  123. package/lib/languages/lt.js +171 -0
  124. package/lib/languages/lv.js +153 -0
  125. package/lib/languages/mr.js +156 -0
  126. package/lib/languages/ms.js +146 -0
  127. package/lib/languages/nb.js +120 -0
  128. package/lib/languages/nl.js +206 -0
  129. package/lib/languages/pa-Guru.js +126 -0
  130. package/lib/languages/pl.js +189 -0
  131. package/lib/languages/pt.js +147 -0
  132. package/lib/languages/ro.js +380 -0
  133. package/lib/languages/ru.js +116 -0
  134. package/lib/languages/sr-Latn.js +157 -0
  135. package/lib/languages/sv.js +127 -0
  136. package/lib/languages/sw.js +121 -0
  137. package/lib/languages/ta.js +226 -0
  138. package/lib/languages/te.js +229 -0
  139. package/lib/languages/th.js +123 -0
  140. package/lib/languages/tr.js +83 -0
  141. package/lib/{i18n → languages}/uk.js +50 -23
  142. package/lib/languages/ur.js +126 -0
  143. package/lib/languages/vi.js +193 -0
  144. package/lib/languages/zh-Hans.js +165 -0
  145. package/lib/n2words.js +246 -75
  146. package/package.json +80 -72
  147. package/typings/classes/abstract-language.d.ts +144 -0
  148. package/typings/classes/greedy-scale-language.d.ts +148 -0
  149. package/typings/classes/slavic-language.d.ts +145 -0
  150. package/typings/classes/south-asian-language.d.ts +101 -0
  151. package/typings/classes/turkic-language.d.ts +42 -0
  152. package/typings/languages/ar.d.ts +93 -0
  153. package/typings/languages/az.d.ts +25 -0
  154. package/typings/languages/bn.d.ts +1 -0
  155. package/typings/languages/cs.d.ts +120 -0
  156. package/typings/languages/da.d.ts +53 -0
  157. package/typings/languages/de.d.ts +26 -0
  158. package/typings/languages/el.d.ts +11 -0
  159. package/typings/languages/en.d.ts +30 -0
  160. package/typings/languages/es.d.ts +43 -0
  161. package/typings/languages/fa.d.ts +81 -0
  162. package/typings/languages/fil.d.ts +12 -0
  163. package/typings/languages/fr-BE.d.ts +41 -0
  164. package/typings/languages/fr.d.ts +43 -0
  165. package/typings/languages/gu.d.ts +12 -0
  166. package/typings/languages/he.d.ts +197 -0
  167. package/typings/languages/hi.d.ts +1 -0
  168. package/typings/languages/hr.d.ts +110 -0
  169. package/typings/languages/hu.d.ts +37 -0
  170. package/typings/languages/id.d.ts +69 -0
  171. package/typings/languages/it.d.ts +51 -0
  172. package/typings/languages/ja.d.ts +58 -0
  173. package/typings/languages/kn.d.ts +11 -0
  174. package/typings/languages/ko.d.ts +25 -0
  175. package/typings/languages/lt.d.ts +110 -0
  176. package/typings/languages/lv.d.ts +99 -0
  177. package/typings/languages/mr.d.ts +12 -0
  178. package/typings/languages/ms.d.ts +37 -0
  179. package/typings/languages/nb.d.ts +27 -0
  180. package/typings/languages/nl.d.ts +65 -0
  181. package/typings/languages/pa-Guru.d.ts +1 -0
  182. package/typings/languages/pl.d.ts +116 -0
  183. package/typings/languages/pt.d.ts +39 -0
  184. package/typings/languages/ro.d.ts +229 -0
  185. package/typings/languages/ru.d.ts +108 -0
  186. package/typings/languages/sr-Latn.d.ts +98 -0
  187. package/typings/languages/sv.d.ts +30 -0
  188. package/typings/languages/sw.d.ts +1 -0
  189. package/typings/languages/ta.d.ts +1 -0
  190. package/typings/languages/te.d.ts +1 -0
  191. package/typings/languages/th.d.ts +1 -0
  192. package/typings/languages/tr.d.ts +46 -0
  193. package/typings/languages/uk.d.ts +117 -0
  194. package/typings/languages/ur.d.ts +1 -0
  195. package/typings/languages/vi.d.ts +116 -0
  196. package/typings/languages/zh-Hans.d.ts +57 -0
  197. package/typings/n2words.d.ts +177 -0
  198. package/dist/ar.js +0 -2
  199. package/dist/ar.js.map +0 -1
  200. package/dist/az.js +0 -2
  201. package/dist/az.js.map +0 -1
  202. package/dist/cz.js +0 -2
  203. package/dist/cz.js.map +0 -1
  204. package/dist/de.js +0 -2
  205. package/dist/de.js.map +0 -1
  206. package/dist/dk.js +0 -2
  207. package/dist/dk.js.map +0 -1
  208. package/dist/en.js +0 -2
  209. package/dist/en.js.map +0 -1
  210. package/dist/es.js +0 -2
  211. package/dist/es.js.map +0 -1
  212. package/dist/fa.js +0 -2
  213. package/dist/fa.js.map +0 -1
  214. package/dist/fr-BE.js +0 -2
  215. package/dist/fr-BE.js.map +0 -1
  216. package/dist/fr.js +0 -2
  217. package/dist/fr.js.map +0 -1
  218. package/dist/he.js +0 -2
  219. package/dist/he.js.map +0 -1
  220. package/dist/hr.js +0 -2
  221. package/dist/hr.js.map +0 -1
  222. package/dist/hu.js +0 -2
  223. package/dist/hu.js.map +0 -1
  224. package/dist/id.js +0 -2
  225. package/dist/id.js.map +0 -1
  226. package/dist/it.js +0 -2
  227. package/dist/it.js.map +0 -1
  228. package/dist/ko.js +0 -2
  229. package/dist/ko.js.map +0 -1
  230. package/dist/lt.js +0 -2
  231. package/dist/lt.js.map +0 -1
  232. package/dist/lv.js +0 -2
  233. package/dist/lv.js.map +0 -1
  234. package/dist/n2words.d.ts +0 -2
  235. package/dist/nl.js +0 -2
  236. package/dist/nl.js.map +0 -1
  237. package/dist/no.js +0 -2
  238. package/dist/no.js.map +0 -1
  239. package/dist/pl.js +0 -2
  240. package/dist/pl.js.map +0 -1
  241. package/dist/pt.js +0 -2
  242. package/dist/pt.js.map +0 -1
  243. package/dist/ro.js +0 -2
  244. package/dist/ro.js.map +0 -1
  245. package/dist/ru.js +0 -2
  246. package/dist/ru.js.map +0 -1
  247. package/dist/sr.js +0 -2
  248. package/dist/sr.js.map +0 -1
  249. package/dist/tr.js +0 -2
  250. package/dist/tr.js.map +0 -1
  251. package/dist/uk.js +0 -2
  252. package/dist/uk.js.map +0 -1
  253. package/dist/vi.js +0 -2
  254. package/dist/vi.js.map +0 -1
  255. package/dist/zh.js +0 -2
  256. package/dist/zh.js.map +0 -1
  257. package/lib/classes/abstract-language.d.ts +0 -54
  258. package/lib/classes/base-language.d.ts +0 -58
  259. package/lib/classes/base-language.js +0 -172
  260. package/lib/i18n/ar.d.ts +0 -41
  261. package/lib/i18n/ar.js +0 -209
  262. package/lib/i18n/az.d.ts +0 -15
  263. package/lib/i18n/az.js +0 -66
  264. package/lib/i18n/cz.d.ts +0 -68
  265. package/lib/i18n/cz.js +0 -135
  266. package/lib/i18n/de.d.ts +0 -17
  267. package/lib/i18n/de.js +0 -103
  268. package/lib/i18n/dk.d.ts +0 -14
  269. package/lib/i18n/dk.js +0 -110
  270. package/lib/i18n/en.d.ts +0 -22
  271. package/lib/i18n/en.js +0 -86
  272. package/lib/i18n/es.d.ts +0 -16
  273. package/lib/i18n/es.js +0 -110
  274. package/lib/i18n/fa.d.ts +0 -54
  275. package/lib/i18n/fa.js +0 -106
  276. package/lib/i18n/fr-BE.d.ts +0 -11
  277. package/lib/i18n/fr-BE.js +0 -20
  278. package/lib/i18n/fr.d.ts +0 -15
  279. package/lib/i18n/fr.js +0 -99
  280. package/lib/i18n/he.d.ts +0 -61
  281. package/lib/i18n/he.js +0 -132
  282. package/lib/i18n/hr.d.ts +0 -68
  283. package/lib/i18n/hr.js +0 -129
  284. package/lib/i18n/hu.d.ts +0 -17
  285. package/lib/i18n/hu.js +0 -135
  286. package/lib/i18n/id.d.ts +0 -43
  287. package/lib/i18n/id.js +0 -156
  288. package/lib/i18n/it.d.ts +0 -29
  289. package/lib/i18n/it.js +0 -137
  290. package/lib/i18n/ko.d.ts +0 -15
  291. package/lib/i18n/ko.js +0 -56
  292. package/lib/i18n/lt.d.ts +0 -68
  293. package/lib/i18n/lt.js +0 -138
  294. package/lib/i18n/lv.d.ts +0 -57
  295. package/lib/i18n/lv.js +0 -120
  296. package/lib/i18n/nl.d.ts +0 -20
  297. package/lib/i18n/nl.js +0 -125
  298. package/lib/i18n/no.d.ts +0 -15
  299. package/lib/i18n/no.js +0 -77
  300. package/lib/i18n/pl.d.ts +0 -67
  301. package/lib/i18n/pl.js +0 -126
  302. package/lib/i18n/pt.d.ts +0 -26
  303. package/lib/i18n/pt.js +0 -118
  304. package/lib/i18n/ro.d.ts +0 -109
  305. package/lib/i18n/ro.js +0 -360
  306. package/lib/i18n/ru.d.ts +0 -30
  307. package/lib/i18n/ru.js +0 -198
  308. package/lib/i18n/sr.d.ts +0 -56
  309. package/lib/i18n/sr.js +0 -127
  310. package/lib/i18n/tr.d.ts +0 -15
  311. package/lib/i18n/tr.js +0 -64
  312. package/lib/i18n/uk.d.ts +0 -78
  313. package/lib/i18n/vi.d.ts +0 -70
  314. package/lib/i18n/vi.js +0 -151
  315. package/lib/i18n/zh.d.ts +0 -18
  316. package/lib/i18n/zh.js +0 -78
  317. package/lib/n2words.d.ts +0 -9
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Converts numbers to their word representation in Kannada (ಕನ್ನಡ).
3
+ * @module languages/kn
4
+ */
5
+
6
+ import SouthAsianLanguage from '../classes/south-asian-language.js'
7
+
8
+ /**
9
+ * Kannada language implementation using Indian-style number grouping.
10
+ * @extends SouthAsianLanguage
11
+ */
12
+ class KannadaLanguage extends SouthAsianLanguage {
13
+ negativeWord = 'ಋಣಾತ್ಮಕ'
14
+ decimalSeparatorWord = 'ದಶಮಾಂಶ'
15
+ zeroWord = 'ಸೊನ್ನೆ'
16
+ hundredWord = 'ನೂರು'
17
+ convertDecimalsPerDigit = true
18
+
19
+ /**
20
+ * Array of number words from 0 to 99.
21
+ * Index matches the number value.
22
+ * @type {string[]}
23
+ */
24
+ belowHundred = [
25
+ 'ಸೊನ್ನೆ', 'ಒಂದು', 'ಎರಡು', 'ಮೂರು', 'ನಾಲ್ಕು', 'ಐದು', 'ಆರು', 'ಏಳು', 'ಎಂಟು', 'ಒಂಬತ್ತು',
26
+ 'ಹತ್ತು', 'ಹನ್ನೊಂದು', 'ಹನ್ನೆರಡು', 'ಹದಿಮೂರು', 'ಹದಿನಾಲ್ಕು', 'ಹದಿನೈದು', 'ಹದಿನಾರು', 'ಹದಿನೇಳು', 'ಹದಿನೆಂಟು', 'ಹತ್ತೊಂಬತ್ತು',
27
+ 'ಇಪ್ಪತ್ತು', 'ಇಪ್ಪತ್ತೊಂದು', 'ಇಪ್ಪತ್ತೆರಡು', 'ಇಪ್ಪತ್ತಮೂರು', 'ಇಪ್ಪತ್ತನಾಲ್ಕು', 'ಇಪ್ಪತ್ತೈದು', 'ಇಪ್ಪತ್ತಾರು', 'ಇಪ್ಪತ್ತೇಳು', 'ಇಪ್ಪತ್ತೆಂಟು', 'ಇಪ್ಪತ್ತೊಂಬತ್ತು',
28
+ 'ಮೂವತ್ತು', 'ಮೂವತ್ತೊಂದು', 'ಮೂವತ್ತೆರಡು', 'ಮೂವತ್ತಮೂರು', 'ಮೂವತ್ತನಾಲ್ಕು', 'ಮೂವತ್ತೈದು', 'ಮೂವತ್ತಾರು', 'ಮೂವತ್ತೇಳು', 'ಮೂವತ್ತೆಂಟು', 'ಮೂವತ್ತೊಂಬತ್ತು',
29
+ 'ನಲವತ್ತು', 'ನಲವತ್ತೊಂದು', 'ನಲವತ್ತೆರಡು', 'ನಲವತ್ತಮೂರು', 'ನಲವತ್ತನಾಲ್ಕು', 'ನಲವತ್ತೈದು', 'ನಲವತ್ತಾರು', 'ನಲವತ್ತೇಳು', 'ನಲವತ್ತೆಂಟು', 'ನಲವತ್ತೊಂಬತ್ತು',
30
+ 'ಐವತ್ತು', 'ಐವತ್ತೊಂದು', 'ಐವತ್ತೆರಡು', 'ಐವತ್ತಮೂರು', 'ಐವತ್ತನಾಲ್ಕು', 'ಐವತ್ತೈದು', 'ಐವತ್ತಾರು', 'ಐವತ್ತೇಳು', 'ಐವತ್ತೆಂಟು', 'ಐವತ್ತೊಂಬತ್ತು',
31
+ 'ಅರವತ್ತು', 'ಅರವತ್ತೊಂದು', 'ಅರವತ್ತೆರಡು', 'ಅರವತ್ತಮೂರು', 'ಅರವತ್ತನಾಲ್ಕು', 'ಅರವತ್ತೈದು', 'ಅರವತ್ತಾರು', 'ಅರವತ್ತೇಳು', 'ಅರವತ್ತೆಂಟು', 'ಅರವತ್ತೊಂಬತ್ತು',
32
+ 'ಎಪ್ಪತ್ತು', 'ಎಪ್ಪತ್ತೊಂದು', 'ಎಪ್ಪತ್ತೆರಡು', 'ಎಪ್ಪತ್ತಮೂರು', 'ಎಪ್ಪತ್ತನಾಲ್ಕು', 'ಎಪ್ಪತ್ತೈದು', 'ಎಪ್ಪತ್ತಾರು', 'ಎಪ್ಪತ್ತೇಳು', 'ಎಪ್ಪತ್ತೆಂಟು', 'ಎಪ್ಪತ್ತೊಂಬತ್ತು',
33
+ 'ಎಂಬತ್ತು', 'ಎಂಬತ್ತೊಂದು', 'ಎಂಬತ್ತೆರಡು', 'ಎಂಬತ್ತಮೂರು', 'ಎಂಬತ್ತನಾಲ್ಕು', 'ಎಂಬತ್ತೈದು', 'ಎಂಬತ್ತಾರು', 'ಎಂಬತ್ತೇಳು', 'ಎಂಬತ್ತೆಂಟು', 'ಎಂಬತ್ತೊಂಬತ್ತು',
34
+ 'ತೊಂಬತ್ತು', 'ತೊಂಬತ್ತೊಂದು', 'ತೊಂಬತ್ತೆರಡು', 'ತೊಂಬತ್ತಮೂರು', 'ತೊಂಬತ್ತನಾಲ್ಕು', 'ತೊಂಬತ್ತೈದು', 'ತೊಂಬತ್ತಾರು', 'ತೊಂಬತ್ತೇಳು', 'ತೊಂಬತ್ತೆಂಟು', 'ತೊಂಬತ್ತೊಂಬತ್ತು'
35
+ ]
36
+
37
+ /**
38
+ * Scale words for powers of ten in Indian numbering system.
39
+ * Index 0 = units, 1 = thousand, 2 = lakh, 3 = crore, etc.
40
+ * @type {string[]}
41
+ */
42
+ scaleWords = [
43
+ '', // units
44
+ 'ಸಾವಿರ', // thousand (1,000)
45
+ 'ಲಕ್ಷ', // lakh (100,000)
46
+ 'ಕೋಟಿ', // crore (10,000,000)
47
+ 'ಅಬ್ಜ', // arab (1,000,000,000)
48
+ 'ಖರ್ವ', // kharab (100,000,000,000)
49
+ 'ನೀಲ', // neel (10,000,000,000,000)
50
+ 'ಪದ್ಮ', // padma (1,000,000,000,000,000)
51
+ 'ಶಂಖ' // shankh (100,000,000,000,000,000)
52
+ ]
53
+
54
+ /**
55
+ * Converts numbers using the belowHundred array directly.
56
+ */
57
+ }
58
+
59
+ /**
60
+ * Converts a number to its word representation in Kannada.
61
+ * @param {number|string|bigint} value - The number to convert
62
+ * @param {Object} [options={}] - Conversion options
63
+ * @returns {string} The word representation of the number
64
+ * @example
65
+ * convertToWords(42) // 'ನಲವತ್ತೆರಡು'
66
+ * convertToWords(1000) // 'ಒಂದು ಸಾವಿರ'
67
+ * convertToWords(100000) // 'ಒಂದು ಲಕ್ಷ'
68
+ */
69
+ export default function convertToWords (value, options = {}) {
70
+ return new KannadaLanguage(options).convertToWords(value)
71
+ }
@@ -0,0 +1,83 @@
1
+ import GreedyScaleLanguage from '../classes/greedy-scale-language.js'
2
+
3
+ /**
4
+ * Korean language converter.
5
+ *
6
+ * Features:
7
+ * - Space-separated for large numbers (>= 만/10,000)
8
+ * - Concatenated for smaller numbers
9
+ * - Omits '일' (1) before multipliers
10
+ */
11
+ export class Korean extends GreedyScaleLanguage {
12
+ negativeWord = '마이너스'
13
+ decimalSeparatorWord = '점'
14
+ zeroWord = '영'
15
+ scaleWordPairs = [
16
+ [10_000_000_000_000_000_000_000_000_000n, '양'],
17
+ [1_000_000_000_000_000_000_000_000n, '자'],
18
+ [100_000_000_000_000_000_000n, '해'],
19
+ [10_000_000_000_000_000n, '경'],
20
+ [1_000_000_000_000n, '조'],
21
+ [100_000_000n, '억'],
22
+ [10_000n, '만'],
23
+ [1000n, '천'],
24
+ [100n, '백'],
25
+ [10n, '십'],
26
+ [9n, '구'],
27
+ [8n, '팔'],
28
+ [7n, '칠'],
29
+ [6n, '육'],
30
+ [5n, '오'],
31
+ [4n, '사'],
32
+ [3n, '삼'],
33
+ [2n, '이'],
34
+ [1n, '일'],
35
+ [0n, '영']
36
+ ]
37
+
38
+ /**
39
+ * Merges two adjacent word-number pairs according to Korean grammar rules.
40
+ *
41
+ * Korean-specific rules:
42
+ * - Omits '일' (1) before multipliers <= 만 (10,000)
43
+ * - Concatenates without space for small numbers (< 만)
44
+ * - Separates with space for large numbers (>= 만)
45
+ * - Multiplies when right > left, adds when left > right
46
+ *
47
+ * @param {Object} leftPair The left operand as `{ word: number }`.
48
+ * @param {Object} rightPair The right operand as `{ word: number }`.
49
+ * @returns {Object} Merged pair with combined word and resulting number.
50
+ */
51
+ mergeScales (leftPair, rightPair) {
52
+ const leftWord = Object.keys(leftPair)[0]
53
+ const rightWord = Object.keys(rightPair)[0]
54
+ const leftNumber = Object.values(leftPair)[0] // BigInt
55
+ const rightNumber = Object.values(rightPair)[0] // BigInt
56
+
57
+ // Implicit "일": omit 1 before multipliers up to 만 (10,000)
58
+ if (leftNumber === 1n && rightNumber <= 10_000n) return rightPair
59
+ // Concatenate (no space) for small numbers less than 만
60
+ if (leftNumber < 10_000n && leftNumber > rightNumber) return { [`${leftWord}${rightWord}`]: leftNumber + rightNumber }
61
+ // Space-separate for large numbers (>= 만) when adding
62
+ if (leftNumber >= 10_000n && leftNumber > rightNumber) return { [`${leftWord} ${rightWord}`]: leftNumber + rightNumber }
63
+ // Multiply for all scale combinations
64
+ return { [`${leftWord}${rightWord}`]: leftNumber * rightNumber }
65
+ }
66
+ }
67
+
68
+ /**
69
+ * Converts a number to Korean cardinal (written) form.
70
+ *
71
+ * @param {number|string|bigint} value The number to convert.
72
+ * @param {Object} [options] Conversion options (see Korean class options).
73
+ * @returns {string} The number expressed in Korean words.
74
+ * @throws {TypeError} If value is NaN or invalid type.
75
+ * @throws {Error} If value is an invalid number string.
76
+ *
77
+ * @example
78
+ * convertToWords(42); // '사십이'
79
+ * convertToWords(10001); // '만 일'
80
+ */
81
+ export default function convertToWords (value, options = {}) {
82
+ return new Korean(options).convertToWords(value)
83
+ }
@@ -0,0 +1,171 @@
1
+ import SlavicLanguage from '../classes/slavic-language.js'
2
+
3
+ /**
4
+ * @typedef {Object} SlavicOptions
5
+ * @property {boolean} [feminine=false] Use feminine forms for numbers.
6
+ */
7
+
8
+ /**
9
+ * Lithuanian language converter.
10
+ *
11
+ * Implements Lithuanian number words using the Slavic language pattern:
12
+ * - Lithuanian number words (vienas/viena, du/dvi, trys, keturi...)
13
+ * - Gender-aware forms (masculine/feminine)
14
+ * - Baltic three-form pluralization (tūkstantis/tūkstančiai/tūkstančių)
15
+ * - Lithuanian-specific declension patterns
16
+ *
17
+ * Key Features:
18
+ * - Three-form pluralization system shared across Slavic/Baltic languages
19
+ * * Form 1 (singular): 1 (e.g., "tūkstantis")
20
+ * * Form 2 (few): 2-4, 22-24, 32-34... excluding teens (e.g., "tūkstančiai")
21
+ * * Form 3 (many): all other numbers (e.g., "tūkstančių")
22
+ * - Chunk-based decomposition (splits into groups of 3 digits: ones, thousands, millions, etc.)
23
+ * - Large number handling via thousands[] array with indexed [singular, few, many] forms
24
+ * - Gender-specific number forms for 1 and 2 (masculine/feminine dual forms)
25
+ *
26
+ * Features:
27
+ * - Dual gender forms (vienas/viena, du/dvi, keturi/keturios)
28
+ * - Complex declension patterns for large numbers
29
+ * - Baltic language characteristics
30
+ *
31
+ * Inherits from SlavicLanguage as Lithuanian uses similar pluralization.
32
+ */
33
+ export class Lithuanian extends SlavicLanguage {
34
+ negativeWord = 'minus'
35
+ decimalSeparatorWord = 'kablelis'
36
+ zeroWord = 'nulis'
37
+ ones = {
38
+ 1: 'vienas',
39
+ 2: 'du',
40
+ 3: 'trys',
41
+ 4: 'keturi',
42
+ 5: 'penki',
43
+ 6: 'šeši',
44
+ 7: 'septyni',
45
+ 8: 'aštuoni',
46
+ 9: 'devyni'
47
+ }
48
+
49
+ onesFeminine = {
50
+ 1: 'viena',
51
+ 2: 'dvi',
52
+ 3: 'trys',
53
+ 4: 'keturios',
54
+ 5: 'penkios',
55
+ 6: 'šešios',
56
+ 7: 'septynios',
57
+ 8: 'aštuonios',
58
+ 9: 'devynios'
59
+ }
60
+
61
+ tens = {
62
+ 0: 'dešimt',
63
+ 1: 'vienuolika',
64
+ 2: 'dvylika',
65
+ 3: 'trylika',
66
+ 4: 'keturiolika',
67
+ 5: 'penkiolika',
68
+ 6: 'šešiolika',
69
+ 7: 'septyniolika',
70
+ 8: 'aštuoniolika',
71
+ 9: 'devyniolika'
72
+ }
73
+
74
+ twenties = {
75
+ 2: 'dvidešimt',
76
+ 3: 'trisdešimt',
77
+ 4: 'keturiasdešimt',
78
+ 5: 'penkiasdešimt',
79
+ 6: 'šešiasdešimt',
80
+ 7: 'septyniasdešimt',
81
+ 8: 'aštuoniasdešimt',
82
+ 9: 'devyniasdešimt'
83
+ }
84
+
85
+ hundreds = ['šimtas', 'šimtai']
86
+
87
+ thousands = {
88
+ 1: ['tūkstantis', 'tūkstančiai', 'tūkstančių'],
89
+ 2: ['milijonas', 'milijonai', 'milijonų'],
90
+ 3: ['milijardas', 'milijardai', 'milijardų'],
91
+ 4: ['trilijonas', 'trilijonai', 'trilijonų'],
92
+ 5: ['kvadrilijonas', 'kvadrilijonai', 'kvadrilijonų'],
93
+ 6: ['kvintilijonas', 'kvintilijonai', 'kvintilijonų'],
94
+ 7: ['sikstilijonas', 'sikstilijonai', 'sikstilijonų'],
95
+ 8: ['septilijonas', 'septilijonai', 'septilijonų'],
96
+ 9: ['oktilijonas', 'oktilijonai', 'oktilijonų'],
97
+ 10: ['naintilijonas', 'naintilijonai', 'naintilijonų']
98
+ }
99
+
100
+ pluralize (n, forms) {
101
+ if (n === 0n) {
102
+ return forms[2]
103
+ }
104
+
105
+ const [n1, n2] = this.getDigits(n)
106
+
107
+ if (n2 === 1n || n1 === 0n) {
108
+ return forms[2]
109
+ }
110
+
111
+ if (n1 === 1n) {
112
+ return forms[0]
113
+ }
114
+
115
+ return forms[1]
116
+ }
117
+
118
+ convertWholePart (number) {
119
+ if (number === 0n) {
120
+ return this.zeroWord
121
+ }
122
+ const words = []
123
+ const chunks = this.splitByX(number.toString(), 3)
124
+ let index = chunks.length
125
+ for (const x of chunks) {
126
+ index = index - 1
127
+ if (x === 0n) {
128
+ continue
129
+ }
130
+ const [n1, n2, n3] = this.getDigits(x)
131
+ if (n3 > 0n) {
132
+ words.push(this.ones[n3])
133
+ if (n3 > 1n) {
134
+ words.push(this.hundreds[1])
135
+ } else {
136
+ words.push(this.hundreds[0])
137
+ }
138
+ }
139
+ if (n2 > 1n) {
140
+ words.push(this.twenties[n2])
141
+ }
142
+ if (n2 === 1n) {
143
+ words.push(this.tens[n1])
144
+ } else if (n1 > 0n) {
145
+ if ((index === 1 || (this.feminine && index === 0)) && number < 1000n) {
146
+ words.push(this.onesFeminine[n1])
147
+ } else {
148
+ words.push(this.ones[n1])
149
+ }
150
+ }
151
+ if (index > 0) {
152
+ words.push(this.pluralize(x, this.thousands[index]))
153
+ }
154
+ }
155
+ return words.join(' ')
156
+ }
157
+ }
158
+
159
+ /**
160
+ * Converts a number to Lithuanian cardinal (written) form.
161
+ *
162
+ * @param {number|string|bigint} value The number to convert.
163
+ * @param {Object} [options={}] Configuration options.
164
+ * @param {boolean} [options.feminine=false] Use feminine forms for numbers.
165
+ * @returns {string} The number expressed in Lithuanian words.
166
+ * @throws {TypeError} If value is NaN or invalid type.
167
+ * @throws {Error} If value is an invalid number string.
168
+ */
169
+ export default function convertToWords (value, options = {}) {
170
+ return new Lithuanian(options).convertToWords(value)
171
+ }
@@ -0,0 +1,153 @@
1
+ import SlavicLanguage from '../classes/slavic-language.js'
2
+
3
+ /**
4
+ * @typedef {Object} SlavicOptions
5
+ * @property {boolean} [feminine=false] Use feminine forms for numbers.
6
+ */
7
+
8
+ /**
9
+ * Latvian language converter.
10
+ *
11
+ * Implements Latvian number words using the Slavic language pattern:
12
+ * - Latvian number words (viens, divi, trīs, četri, pieci...)
13
+ * - Latvian-specific pluralization patterns
14
+ * - Baltic grammatical structure
15
+ * - Simplified gender handling compared to Lithuanian
16
+ *
17
+ * Key Features:
18
+ * - Three-form pluralization system shared across Slavic/Baltic languages
19
+ * * Form 1 (singular): 1 (e.g., "tūkstotis")
20
+ * * Form 2 (few): 2-4, 22-24, 32-34... excluding teens (e.g., "tūkstoši")
21
+ * * Form 3 (many): all other numbers (e.g., "tūkstošu")
22
+ * - Chunk-based decomposition (splits into groups of 3 digits: ones, thousands, millions, etc.)
23
+ * - Large number handling via thousands[] array with indexed [singular, few, many] forms
24
+ *
25
+ * Features:
26
+ * - Latvian diacritical marks (ī, ā, ē, ū, etc.)
27
+ * - Three-form pluralization (adapted for Latvian)
28
+ * - Baltic number naming conventions
29
+ * - Compound number formation (divdesmit, trīsdesmit)
30
+ *
31
+ * Inherits from SlavicLanguage for pluralization algorithms.
32
+ */
33
+ export class Latvian extends SlavicLanguage {
34
+ negativeWord = 'mīnus'
35
+ decimalSeparatorWord = 'komats'
36
+ zeroWord = 'nulle'
37
+ ones = {
38
+ 1: 'viens',
39
+ 2: 'divi',
40
+ 3: 'trīs',
41
+ 4: 'četri',
42
+ 5: 'pieci',
43
+ 6: 'seši',
44
+ 7: 'septiņi',
45
+ 8: 'astoņi',
46
+ 9: 'deviņi'
47
+ }
48
+
49
+ tens = {
50
+ 0: 'desmit',
51
+ 1: 'vienpadsmit',
52
+ 2: 'divpadsmit',
53
+ 3: 'trīspadsmit',
54
+ 4: 'četrpadsmit',
55
+ 5: 'piecpadsmit',
56
+ 6: 'sešpadsmit',
57
+ 7: 'septiņpadsmit',
58
+ 8: 'astoņpadsmit',
59
+ 9: 'deviņpadsmit'
60
+ }
61
+
62
+ twenties = {
63
+ 2: 'divdesmit',
64
+ 3: 'trīsdesmit',
65
+ 4: 'četrdesmit',
66
+ 5: 'piecdesmit',
67
+ 6: 'sešdesmit',
68
+ 7: 'septiņdesmit',
69
+ 8: 'astoņdesmit',
70
+ 9: 'deviņdesmit'
71
+ }
72
+
73
+ hundreds = ['simts', 'simti', 'simtu']
74
+
75
+ thousands = {
76
+ 1: ['tūkstotis', 'tūkstoši', 'tūkstošu'],
77
+ 2: ['miljons', 'miljoni', 'miljonu'],
78
+ 3: ['miljards', 'miljardi', 'miljardu'],
79
+ 4: ['triljons', 'triljoni', 'triljonu'],
80
+ 5: ['kvadriljons', 'kvadriljoni', 'kvadriljonu'],
81
+ 6: ['kvintiljons', 'kvintiljoni', 'kvintiljonu'],
82
+ 7: ['sikstiljons', 'sikstiljoni', 'sikstiljonu'],
83
+ 8: ['septiljons', 'septiljoni', 'septiljonu'],
84
+ 9: ['oktiljons', 'oktiljoni', 'oktiljonu'],
85
+ 10: ['nontiljons', 'nontiljoni', 'nontiljonu']
86
+ }
87
+
88
+ pluralize (n, forms) {
89
+ if (n === 0n) {
90
+ return forms[2]
91
+ }
92
+
93
+ const lastDigit = n % 10n
94
+ const lastTwoDigits = n % 100n
95
+
96
+ if (lastDigit === 1n && lastTwoDigits !== 11n) {
97
+ return forms[0]
98
+ }
99
+
100
+ return forms[1]
101
+ }
102
+
103
+ convertWholePart (number) {
104
+ if (number === 0n) {
105
+ return this.zeroWord
106
+ }
107
+ const words = []
108
+ const chunks = this.splitByX(number.toString(), 3)
109
+ let index = chunks.length
110
+ for (const x of chunks) {
111
+ index = index - 1
112
+ if (x === 0n) {
113
+ continue
114
+ }
115
+ const [n1, n2, n3] = this.getDigits(x)
116
+ if (n3 > 0n) {
117
+ if (n3 === 1n && n2 === 0n && n1 > 0n) {
118
+ words.push(this.hundreds[2])
119
+ } else if (n3 > 1n) {
120
+ words.push(this.ones[n3], this.hundreds[1])
121
+ } else {
122
+ words.push(this.hundreds[0])
123
+ }
124
+ }
125
+ if (n2 > 1n) {
126
+ words.push(this.twenties[n2])
127
+ }
128
+ if (n2 === 1n) {
129
+ words.push(this.tens[n1])
130
+ } else if (n1 > 0n && !(index > 0 && x === 1n)) {
131
+ words.push(this.ones[n1])
132
+ }
133
+ if (index > 0) {
134
+ words.push(this.pluralize(x, this.thousands[index]))
135
+ }
136
+ }
137
+ return words.join(' ')
138
+ }
139
+ }
140
+
141
+ /**
142
+ * Converts a number to Latvian cardinal (written) form.
143
+ *
144
+ * @param {number|string|bigint} value The number to convert.
145
+ * @param {Object} [options={}] Configuration options.
146
+ * @param {boolean} [options.feminine=false] Use feminine forms for numbers.
147
+ * @returns {string} The number expressed in Latvian words.
148
+ * @throws {TypeError} If value is NaN or invalid type.
149
+ * @throws {Error} If value is an invalid number string.
150
+ */
151
+ export default function convertToWords (value, options = {}) {
152
+ return new Latvian(options).convertToWords(value)
153
+ }
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Marathi language implementation for n2words
3
+ *
4
+ * Marathi uses Indian-style number grouping (3 digits, then 2-2 from right).
5
+ * Numbers: शून्य (0), एक (1), दोन (2), तीन (3), चार (4), पाच (5)...
6
+ *
7
+ * @module lib/languages/mr
8
+ * @example
9
+ * import mr from './lib/languages/mr.js'
10
+ * mr(42) // 'बेचाळीस'
11
+ * mr(1000) // 'एक हजार'
12
+ */
13
+
14
+ import SouthAsianLanguage from '../classes/south-asian-language.js'
15
+
16
+ /**
17
+ * Marathi language implementation
18
+ * Extends SouthAsianLanguage for Indian-style grouping
19
+ */
20
+ class MarathiLanguage extends SouthAsianLanguage {
21
+ negativeWord = 'उणे'
22
+ decimalSeparatorWord = 'दशांश'
23
+ zeroWord = 'शून्य'
24
+ hundredWord = 'शंभर'
25
+ convertDecimalsPerDigit = true
26
+
27
+ belowHundred = [
28
+ 'शून्य',
29
+ 'एक',
30
+ 'दोन',
31
+ 'तीन',
32
+ 'चार',
33
+ 'पाच',
34
+ 'सहा',
35
+ 'सात',
36
+ 'आठ',
37
+ 'नऊ',
38
+ 'दहा',
39
+ 'अकरा',
40
+ 'बारा',
41
+ 'तेरा',
42
+ 'चौदा',
43
+ 'पंधरा',
44
+ 'सोळा',
45
+ 'सतरा',
46
+ 'अठरा',
47
+ 'एकोणीस',
48
+ 'वीस',
49
+ 'एकवीस',
50
+ 'बावीस',
51
+ 'तेवीस',
52
+ 'चोवीस',
53
+ 'पंचवीस',
54
+ 'सव्वीस',
55
+ 'सत्तावीस',
56
+ 'अठ्ठावीस',
57
+ 'एकोणतीस',
58
+ 'तीस',
59
+ 'एकतीस',
60
+ 'बत्तीस',
61
+ 'तेहेतीस',
62
+ 'चौतीस',
63
+ 'पस्तीस',
64
+ 'छत्तीस',
65
+ 'सदतीस',
66
+ 'अडतीस',
67
+ 'एकोणचाळीस',
68
+ 'चाळीस',
69
+ 'एकेचाळीस',
70
+ 'बेचाळीस',
71
+ 'त्रेचाळीस',
72
+ 'चव्वेचाळीस',
73
+ 'पंचेचाळीस',
74
+ 'सेहेचाळीस',
75
+ 'सत्तेचाळीस',
76
+ 'अठ्ठेचाळीस',
77
+ 'एकोणपन्नास',
78
+ 'पन्नास',
79
+ 'एक्काव्वन',
80
+ 'बावन्न',
81
+ 'त्रेपन्न',
82
+ 'चोपन्न',
83
+ 'पंचाव्वन',
84
+ 'छप्पन्न',
85
+ 'सत्तावन्न',
86
+ 'अठ्ठावन्न',
87
+ 'एकोणसाठ',
88
+ 'साठ',
89
+ 'एकसष्ठ',
90
+ 'बासष्ठ',
91
+ 'त्रेसष्ठ',
92
+ 'चौसष्ठ',
93
+ 'पासष्ठ',
94
+ 'सहासष्ठ',
95
+ 'सदुसष्ठ',
96
+ 'अडुसष्ठ',
97
+ 'एकोणसत्तर',
98
+ 'सत्तर',
99
+ 'एकाहत्तर',
100
+ 'बाहत्तर',
101
+ 'त्र्याहत्तर',
102
+ 'चौऱ्याहत्तर',
103
+ 'पंच्याहत्तर',
104
+ 'शहात्तर',
105
+ 'सत्याहत्तर',
106
+ 'अठ्ठ्याहत्तर',
107
+ 'एकोणऐंशी',
108
+ 'ऐंशी',
109
+ 'एक्याऐंशी',
110
+ 'ब्याऐंशी',
111
+ 'त्र्याऐंशी',
112
+ 'चौऱ्याऐंशी',
113
+ 'पंच्याऐंशी',
114
+ 'शहाऐंशी',
115
+ 'सत्याऐंशी',
116
+ 'अठ्ठ्याऐंशी',
117
+ 'एकोणनव्वद',
118
+ 'नव्वद',
119
+ 'एक्याण्णव',
120
+ 'ब्याण्णव',
121
+ 'त्र्याण्णव',
122
+ 'चौऱ्याण्णव',
123
+ 'पंच्याण्णव',
124
+ 'शहाण्णव',
125
+ 'सत्याण्णव',
126
+ 'अठ्ठ्याण्णव',
127
+ 'नव्याण्णव'
128
+ ]
129
+
130
+ scaleWords = [
131
+ '',
132
+ 'हजार',
133
+ 'लाख',
134
+ 'कोटी',
135
+ 'अब्ज',
136
+ 'खर्व',
137
+ 'निखर्व',
138
+ 'महापद्म',
139
+ 'शंकू'
140
+ ]
141
+ }
142
+
143
+ /**
144
+ * Convert a number to Marathi words
145
+ *
146
+ * @param {number|string|bigint} value - The number to convert
147
+ * @param {Object} [options={}] - Conversion options
148
+ * @returns {string} The Marathi word representation
149
+ * @example
150
+ * convertToWords(42) // 'बेचाळीस'
151
+ * convertToWords(1000) // 'एक हजार'
152
+ * convertToWords(100000) // 'एक लाख'
153
+ */
154
+ export default function convertToWords (value, options = {}) {
155
+ return new MarathiLanguage(options).convertToWords(value)
156
+ }