n2words 1.24.0 → 2.0.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 (349) hide show
  1. package/README.md +285 -156
  2. package/dist/ArabicConverter.js +3 -0
  3. package/dist/ArabicConverter.js.map +1 -0
  4. package/dist/AzerbaijaniConverter.js +3 -0
  5. package/dist/AzerbaijaniConverter.js.map +1 -0
  6. package/dist/BanglaConverter.js +3 -0
  7. package/dist/BanglaConverter.js.map +1 -0
  8. package/dist/BiblicalHebrewConverter.js +3 -0
  9. package/dist/BiblicalHebrewConverter.js.map +1 -0
  10. package/dist/CroatianConverter.js +3 -0
  11. package/dist/CroatianConverter.js.map +1 -0
  12. package/dist/CzechConverter.js +3 -0
  13. package/dist/CzechConverter.js.map +1 -0
  14. package/dist/DanishConverter.js +3 -0
  15. package/dist/DanishConverter.js.map +1 -0
  16. package/dist/DutchConverter.js +3 -0
  17. package/dist/DutchConverter.js.map +1 -0
  18. package/dist/EnglishConverter.js +3 -0
  19. package/dist/EnglishConverter.js.map +1 -0
  20. package/dist/FilipinoConverter.js +3 -0
  21. package/dist/FilipinoConverter.js.map +1 -0
  22. package/dist/FrenchBelgiumConverter.js +3 -0
  23. package/dist/FrenchBelgiumConverter.js.map +1 -0
  24. package/dist/FrenchConverter.js +3 -0
  25. package/dist/FrenchConverter.js.map +1 -0
  26. package/dist/GermanConverter.js +3 -0
  27. package/dist/GermanConverter.js.map +1 -0
  28. package/dist/GreekConverter.js +3 -0
  29. package/dist/GreekConverter.js.map +1 -0
  30. package/dist/GujaratiConverter.js +3 -0
  31. package/dist/GujaratiConverter.js.map +1 -0
  32. package/dist/HebrewConverter.js +3 -0
  33. package/dist/HebrewConverter.js.map +1 -0
  34. package/dist/HindiConverter.js +3 -0
  35. package/dist/HindiConverter.js.map +1 -0
  36. package/dist/HungarianConverter.js +3 -0
  37. package/dist/HungarianConverter.js.map +1 -0
  38. package/dist/IndonesianConverter.js +3 -0
  39. package/dist/IndonesianConverter.js.map +1 -0
  40. package/dist/ItalianConverter.js +3 -0
  41. package/dist/ItalianConverter.js.map +1 -0
  42. package/dist/JapaneseConverter.js +3 -0
  43. package/dist/JapaneseConverter.js.map +1 -0
  44. package/dist/KannadaConverter.js +3 -0
  45. package/dist/KannadaConverter.js.map +1 -0
  46. package/dist/KoreanConverter.js +3 -0
  47. package/dist/KoreanConverter.js.map +1 -0
  48. package/dist/LatvianConverter.js +3 -0
  49. package/dist/LatvianConverter.js.map +1 -0
  50. package/dist/LithuanianConverter.js +3 -0
  51. package/dist/LithuanianConverter.js.map +1 -0
  52. package/dist/MalayConverter.js +3 -0
  53. package/dist/MalayConverter.js.map +1 -0
  54. package/dist/MarathiConverter.js +3 -0
  55. package/dist/MarathiConverter.js.map +1 -0
  56. package/dist/NorwegianBokmalConverter.js +3 -0
  57. package/dist/NorwegianBokmalConverter.js.map +1 -0
  58. package/dist/PersianConverter.js +3 -0
  59. package/dist/PersianConverter.js.map +1 -0
  60. package/dist/PolishConverter.js +3 -0
  61. package/dist/PolishConverter.js.map +1 -0
  62. package/dist/PortugueseConverter.js +3 -0
  63. package/dist/PortugueseConverter.js.map +1 -0
  64. package/dist/PunjabiConverter.js +3 -0
  65. package/dist/PunjabiConverter.js.map +1 -0
  66. package/dist/RomanianConverter.js +3 -0
  67. package/dist/RomanianConverter.js.map +1 -0
  68. package/dist/RussianConverter.js +3 -0
  69. package/dist/RussianConverter.js.map +1 -0
  70. package/dist/SerbianCyrillicConverter.js +3 -0
  71. package/dist/SerbianCyrillicConverter.js.map +1 -0
  72. package/dist/SerbianLatinConverter.js +3 -0
  73. package/dist/SerbianLatinConverter.js.map +1 -0
  74. package/dist/SimplifiedChineseConverter.js +3 -0
  75. package/dist/SimplifiedChineseConverter.js.map +1 -0
  76. package/dist/SpanishConverter.js +3 -0
  77. package/dist/SpanishConverter.js.map +1 -0
  78. package/dist/SwahiliConverter.js +3 -0
  79. package/dist/SwahiliConverter.js.map +1 -0
  80. package/dist/SwedishConverter.js +3 -0
  81. package/dist/SwedishConverter.js.map +1 -0
  82. package/dist/TamilConverter.js +3 -0
  83. package/dist/TamilConverter.js.map +1 -0
  84. package/dist/TeluguConverter.js +3 -0
  85. package/dist/TeluguConverter.js.map +1 -0
  86. package/dist/ThaiConverter.js +3 -0
  87. package/dist/ThaiConverter.js.map +1 -0
  88. package/dist/TraditionalChineseConverter.js +3 -0
  89. package/dist/TraditionalChineseConverter.js.map +1 -0
  90. package/dist/TurkishConverter.js +3 -0
  91. package/dist/TurkishConverter.js.map +1 -0
  92. package/dist/UkrainianConverter.js +3 -0
  93. package/dist/UkrainianConverter.js.map +1 -0
  94. package/dist/UrduConverter.js +3 -0
  95. package/dist/UrduConverter.js.map +1 -0
  96. package/dist/VietnameseConverter.js +3 -0
  97. package/dist/VietnameseConverter.js.map +1 -0
  98. package/dist/n2words.js +3 -2
  99. package/dist/n2words.js.map +1 -1
  100. package/lib/classes/abstract-language.d.ts +178 -0
  101. package/lib/classes/abstract-language.js +192 -185
  102. package/lib/classes/greedy-scale-language.d.ts +109 -0
  103. package/lib/classes/greedy-scale-language.js +96 -90
  104. package/lib/classes/slavic-language.d.ts +148 -0
  105. package/lib/classes/slavic-language.js +136 -106
  106. package/lib/classes/south-asian-language.d.ts +70 -0
  107. package/lib/classes/south-asian-language.js +58 -65
  108. package/lib/classes/turkic-language.d.ts +26 -0
  109. package/lib/classes/turkic-language.js +22 -26
  110. package/lib/languages/ar.d.ts +30 -0
  111. package/lib/languages/ar.js +49 -133
  112. package/lib/languages/az.d.ts +12 -0
  113. package/lib/languages/az.js +7 -23
  114. package/lib/languages/bn.d.ts +11 -0
  115. package/lib/languages/bn.js +12 -7
  116. package/lib/languages/cs.d.ts +88 -0
  117. package/lib/languages/cs.js +44 -113
  118. package/lib/languages/da.d.ts +15 -0
  119. package/lib/languages/da.js +40 -87
  120. package/lib/languages/de.d.ts +14 -0
  121. package/lib/languages/de.js +34 -68
  122. package/lib/languages/el.d.ts +14 -0
  123. package/lib/languages/el.js +22 -48
  124. package/lib/languages/en.d.ts +16 -0
  125. package/lib/languages/en.js +22 -59
  126. package/lib/languages/es.d.ts +15 -0
  127. package/lib/languages/es.js +49 -81
  128. package/lib/languages/fa.d.ts +47 -0
  129. package/lib/languages/fa.js +90 -73
  130. package/lib/languages/fil.d.ts +16 -0
  131. package/lib/languages/fil.js +35 -76
  132. package/lib/languages/fr-BE.d.ts +11 -0
  133. package/lib/languages/fr-BE.js +15 -51
  134. package/lib/languages/fr.d.ts +15 -0
  135. package/lib/languages/fr.js +33 -72
  136. package/lib/languages/gu.d.ts +11 -0
  137. package/lib/languages/gu.js +10 -34
  138. package/lib/languages/hbo.d.ts +113 -0
  139. package/lib/languages/hbo.js +251 -0
  140. package/lib/languages/he.d.ts +80 -0
  141. package/lib/languages/he.js +41 -164
  142. package/lib/languages/hi.d.ts +11 -0
  143. package/lib/languages/hi.js +12 -7
  144. package/lib/languages/hr.d.ts +80 -0
  145. package/lib/languages/hr.js +51 -95
  146. package/lib/languages/hu.d.ts +22 -0
  147. package/lib/languages/hu.js +35 -53
  148. package/lib/languages/id.d.ts +37 -0
  149. package/lib/languages/id.js +29 -44
  150. package/lib/languages/it.d.ts +37 -0
  151. package/lib/languages/it.js +36 -52
  152. package/lib/languages/ja.d.ts +17 -0
  153. package/lib/languages/ja.js +22 -75
  154. package/lib/languages/kn.d.ts +11 -0
  155. package/lib/languages/kn.js +10 -39
  156. package/lib/languages/ko.d.ts +14 -0
  157. package/lib/languages/ko.js +17 -45
  158. package/lib/languages/lt.d.ts +70 -0
  159. package/lib/languages/lt.js +28 -63
  160. package/lib/languages/lv.d.ts +70 -0
  161. package/lib/languages/lv.js +35 -58
  162. package/lib/languages/mr.d.ts +11 -0
  163. package/lib/languages/mr.js +10 -34
  164. package/lib/languages/ms.d.ts +31 -0
  165. package/lib/languages/ms.js +24 -20
  166. package/lib/languages/nb.d.ts +12 -0
  167. package/lib/languages/nb.js +36 -56
  168. package/lib/languages/nl.d.ts +16 -0
  169. package/lib/languages/nl.js +58 -109
  170. package/lib/languages/pa.d.ts +11 -0
  171. package/lib/languages/{pa-Guru.js → pa.js} +12 -7
  172. package/lib/languages/pl.d.ts +80 -0
  173. package/lib/languages/pl.js +26 -105
  174. package/lib/languages/pt.d.ts +29 -0
  175. package/lib/languages/pt.js +29 -64
  176. package/lib/languages/ro.d.ts +158 -0
  177. package/lib/languages/ro.js +60 -167
  178. package/lib/languages/ru.d.ts +85 -0
  179. package/lib/languages/ru.js +17 -37
  180. package/lib/languages/sr-Cyrl.d.ts +80 -0
  181. package/lib/languages/sr-Cyrl.js +113 -0
  182. package/lib/languages/sr-Latn.d.ts +80 -0
  183. package/lib/languages/sr-Latn.js +54 -98
  184. package/lib/languages/sv.d.ts +14 -0
  185. package/lib/languages/sv.js +26 -63
  186. package/lib/languages/sw.d.ts +39 -0
  187. package/lib/languages/sw.js +26 -21
  188. package/lib/languages/ta.d.ts +20 -0
  189. package/lib/languages/ta.js +26 -26
  190. package/lib/languages/te.d.ts +22 -0
  191. package/lib/languages/te.js +28 -38
  192. package/lib/languages/th.d.ts +17 -0
  193. package/lib/languages/th.js +25 -31
  194. package/lib/languages/tr.d.ts +12 -0
  195. package/lib/languages/tr.js +11 -38
  196. package/lib/languages/uk.d.ts +85 -0
  197. package/lib/languages/uk.js +18 -44
  198. package/lib/languages/ur.d.ts +11 -0
  199. package/lib/languages/ur.js +12 -7
  200. package/lib/languages/vi.d.ts +72 -0
  201. package/lib/languages/vi.js +25 -71
  202. package/lib/languages/zh-Hans.d.ts +21 -0
  203. package/lib/languages/zh-Hans.js +33 -87
  204. package/lib/languages/zh-Hant.d.ts +21 -0
  205. package/lib/languages/zh-Hant.js +111 -0
  206. package/lib/n2words.d.ts +209 -0
  207. package/lib/n2words.js +474 -191
  208. package/package.json +106 -67
  209. package/dist/languages/ar.js +0 -2
  210. package/dist/languages/ar.js.map +0 -1
  211. package/dist/languages/az.js +0 -2
  212. package/dist/languages/az.js.map +0 -1
  213. package/dist/languages/bn.js +0 -2
  214. package/dist/languages/bn.js.map +0 -1
  215. package/dist/languages/cs.js +0 -2
  216. package/dist/languages/cs.js.map +0 -1
  217. package/dist/languages/da.js +0 -2
  218. package/dist/languages/da.js.map +0 -1
  219. package/dist/languages/de.js +0 -2
  220. package/dist/languages/de.js.map +0 -1
  221. package/dist/languages/el.js +0 -2
  222. package/dist/languages/el.js.map +0 -1
  223. package/dist/languages/en.js +0 -2
  224. package/dist/languages/en.js.map +0 -1
  225. package/dist/languages/es.js +0 -2
  226. package/dist/languages/es.js.map +0 -1
  227. package/dist/languages/fa.js +0 -2
  228. package/dist/languages/fa.js.map +0 -1
  229. package/dist/languages/fil.js +0 -2
  230. package/dist/languages/fil.js.map +0 -1
  231. package/dist/languages/fr-BE.js +0 -2
  232. package/dist/languages/fr-BE.js.map +0 -1
  233. package/dist/languages/fr.js +0 -2
  234. package/dist/languages/fr.js.map +0 -1
  235. package/dist/languages/gu.js +0 -2
  236. package/dist/languages/gu.js.map +0 -1
  237. package/dist/languages/he.js +0 -2
  238. package/dist/languages/he.js.map +0 -1
  239. package/dist/languages/hi.js +0 -2
  240. package/dist/languages/hi.js.map +0 -1
  241. package/dist/languages/hr.js +0 -2
  242. package/dist/languages/hr.js.map +0 -1
  243. package/dist/languages/hu.js +0 -2
  244. package/dist/languages/hu.js.map +0 -1
  245. package/dist/languages/id.js +0 -2
  246. package/dist/languages/id.js.map +0 -1
  247. package/dist/languages/it.js +0 -2
  248. package/dist/languages/it.js.map +0 -1
  249. package/dist/languages/ja.js +0 -2
  250. package/dist/languages/ja.js.map +0 -1
  251. package/dist/languages/kn.js +0 -2
  252. package/dist/languages/kn.js.map +0 -1
  253. package/dist/languages/ko.js +0 -2
  254. package/dist/languages/ko.js.map +0 -1
  255. package/dist/languages/lt.js +0 -2
  256. package/dist/languages/lt.js.map +0 -1
  257. package/dist/languages/lv.js +0 -2
  258. package/dist/languages/lv.js.map +0 -1
  259. package/dist/languages/mr.js +0 -2
  260. package/dist/languages/mr.js.map +0 -1
  261. package/dist/languages/ms.js +0 -2
  262. package/dist/languages/ms.js.map +0 -1
  263. package/dist/languages/nb.js +0 -2
  264. package/dist/languages/nb.js.map +0 -1
  265. package/dist/languages/nl.js +0 -2
  266. package/dist/languages/nl.js.map +0 -1
  267. package/dist/languages/pa-Guru.js +0 -2
  268. package/dist/languages/pa-Guru.js.map +0 -1
  269. package/dist/languages/pl.js +0 -2
  270. package/dist/languages/pl.js.map +0 -1
  271. package/dist/languages/pt.js +0 -2
  272. package/dist/languages/pt.js.map +0 -1
  273. package/dist/languages/ro.js +0 -2
  274. package/dist/languages/ro.js.map +0 -1
  275. package/dist/languages/ru.js +0 -2
  276. package/dist/languages/ru.js.map +0 -1
  277. package/dist/languages/sr-Latn.js +0 -2
  278. package/dist/languages/sr-Latn.js.map +0 -1
  279. package/dist/languages/sv.js +0 -2
  280. package/dist/languages/sv.js.map +0 -1
  281. package/dist/languages/sw.js +0 -2
  282. package/dist/languages/sw.js.map +0 -1
  283. package/dist/languages/ta.js +0 -2
  284. package/dist/languages/ta.js.map +0 -1
  285. package/dist/languages/te.js +0 -2
  286. package/dist/languages/te.js.map +0 -1
  287. package/dist/languages/th.js +0 -2
  288. package/dist/languages/th.js.map +0 -1
  289. package/dist/languages/tr.js +0 -2
  290. package/dist/languages/tr.js.map +0 -1
  291. package/dist/languages/uk.js +0 -2
  292. package/dist/languages/uk.js.map +0 -1
  293. package/dist/languages/ur.js +0 -2
  294. package/dist/languages/ur.js.map +0 -1
  295. package/dist/languages/vi.js +0 -2
  296. package/dist/languages/vi.js.map +0 -1
  297. package/dist/languages/zh-Hans.js +0 -2
  298. package/dist/languages/zh-Hans.js.map +0 -1
  299. package/typings/classes/abstract-language.d.ts +0 -144
  300. package/typings/classes/greedy-scale-language.d.ts +0 -148
  301. package/typings/classes/slavic-language.d.ts +0 -145
  302. package/typings/classes/south-asian-language.d.ts +0 -101
  303. package/typings/classes/turkic-language.d.ts +0 -42
  304. package/typings/languages/ar.d.ts +0 -93
  305. package/typings/languages/az.d.ts +0 -25
  306. package/typings/languages/bn.d.ts +0 -1
  307. package/typings/languages/cs.d.ts +0 -120
  308. package/typings/languages/da.d.ts +0 -53
  309. package/typings/languages/de.d.ts +0 -26
  310. package/typings/languages/el.d.ts +0 -11
  311. package/typings/languages/en.d.ts +0 -30
  312. package/typings/languages/es.d.ts +0 -43
  313. package/typings/languages/fa.d.ts +0 -81
  314. package/typings/languages/fil.d.ts +0 -12
  315. package/typings/languages/fr-BE.d.ts +0 -41
  316. package/typings/languages/fr.d.ts +0 -43
  317. package/typings/languages/gu.d.ts +0 -12
  318. package/typings/languages/he.d.ts +0 -197
  319. package/typings/languages/hi.d.ts +0 -1
  320. package/typings/languages/hr.d.ts +0 -110
  321. package/typings/languages/hu.d.ts +0 -37
  322. package/typings/languages/id.d.ts +0 -69
  323. package/typings/languages/it.d.ts +0 -51
  324. package/typings/languages/ja.d.ts +0 -58
  325. package/typings/languages/kn.d.ts +0 -11
  326. package/typings/languages/ko.d.ts +0 -25
  327. package/typings/languages/lt.d.ts +0 -110
  328. package/typings/languages/lv.d.ts +0 -99
  329. package/typings/languages/mr.d.ts +0 -12
  330. package/typings/languages/ms.d.ts +0 -37
  331. package/typings/languages/nb.d.ts +0 -27
  332. package/typings/languages/nl.d.ts +0 -65
  333. package/typings/languages/pa-Guru.d.ts +0 -1
  334. package/typings/languages/pl.d.ts +0 -116
  335. package/typings/languages/pt.d.ts +0 -39
  336. package/typings/languages/ro.d.ts +0 -229
  337. package/typings/languages/ru.d.ts +0 -108
  338. package/typings/languages/sr-Latn.d.ts +0 -98
  339. package/typings/languages/sv.d.ts +0 -30
  340. package/typings/languages/sw.d.ts +0 -1
  341. package/typings/languages/ta.d.ts +0 -1
  342. package/typings/languages/te.d.ts +0 -1
  343. package/typings/languages/th.d.ts +0 -1
  344. package/typings/languages/tr.d.ts +0 -46
  345. package/typings/languages/uk.d.ts +0 -117
  346. package/typings/languages/ur.d.ts +0 -1
  347. package/typings/languages/vi.d.ts +0 -116
  348. package/typings/languages/zh-Hans.d.ts +0 -57
  349. package/typings/n2words.d.ts +0 -177
@@ -1,24 +1,20 @@
1
- import GreedyScaleLanguage from '../classes/greedy-scale-language.js'
1
+ import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'
2
2
 
3
3
  /**
4
4
  * Swedish language converter.
5
5
  *
6
- * Converts numbers to Swedish words, supporting:
7
- * - Negative numbers (prepended with "minus")
8
- * - Decimal numbers (word "komma" between whole and fractional parts)
9
- * - Numbers up to quadrillions
10
- *
11
- * Merge rules:
12
- * - Hyphenated for compound tens (e.g., "tjugo-tre")
13
- * - "och" (and) after hundreds (e.g., "hundra och ett")
14
- * - Space-separated for larger composites (e.g., "en miljon")
6
+ * Supports:
7
+ * - Hyphenation for compound tens (tjugo-tre)
8
+ * - "och" (and) after hundreds
9
+ * - Space-separated larger composites
15
10
  */
16
11
  export class Swedish extends GreedyScaleLanguage {
17
12
  negativeWord = 'minus'
18
13
  decimalSeparatorWord = 'komma'
19
14
  zeroWord = 'noll'
20
15
  wordSeparator = ' '
21
- scaleWordPairs = [
16
+
17
+ scaleWords = [
22
18
  [1_000_000_000_000_000_000_000_000_000n, 'kvadriljon'],
23
19
  [1_000_000_000_000_000_000_000_000n, 'triljon'],
24
20
  [1_000_000_000_000_000_000_000n, 'biljon'],
@@ -58,70 +54,37 @@ export class Swedish extends GreedyScaleLanguage {
58
54
  [0n, 'noll']
59
55
  ]
60
56
 
61
- /**
62
- * Merges two adjacent word-number pairs according to Swedish grammar rules.
63
- *
64
- * Swedish-specific rules:
65
- * - Implicit "ett": `mergeScales({ 'ett': 1n }, { 'hundra': 100n })` → `{ 'hundra': 100n }`
66
- * - Hyphenated compounds: `mergeScales({ 'tjugo': 20n }, { 'tre': 3n })` → `{ 'tjugo-tre': 23n }`
67
- * - "och" after hundreds: `mergeScales({ 'hundra': 100n }, { 'ett': 1n })` → `{ 'hundra och ett': 101n }`
68
- * - "en" for millions: `mergeScales({ 'ett': 1n }, { 'miljon': 1000000n })` → `{ 'en miljon': 1000000n }`
69
- *
70
- * @param {Object} leftPair Left word-set as `{ word: BigInt }`.
71
- * @param {Object} rightPair Right word-set as `{ word: BigInt }`.
72
- * @returns {Object} Merged pair with combined word and resulting numeric value.
73
- *
74
- * @example
75
- * mergeScales({ 'ett': 1n }, { 'hundra': 100n }); // { 'hundra': 100n }
76
- * mergeScales({ 'tjugo': 20n }, { 'tre': 3n }); // { 'tjugo-tre': 23n }
77
- */
78
- mergeScales (leftPair, rightPair) {
79
- const leftWord = Object.keys(leftPair)[0]
80
- const rightWord = Object.keys(rightPair)[0]
81
- const leftNumber = Object.values(leftPair)[0]
82
- const rightNumber = Object.values(rightPair)[0]
57
+ /** Combines two word-sets according to Swedish grammar rules. */
58
+ combineWordSets (preceding, following) {
59
+ const precedingWord = Object.keys(preceding)[0]
60
+ const followingWord = Object.keys(following)[0]
61
+ const precedingValue = Object.values(preceding)[0]
62
+ const followingValue = Object.values(following)[0]
83
63
 
84
- if (leftNumber === 1n && rightNumber < 100n) {
85
- return rightPair
64
+ if (precedingValue === 1n && followingValue < 100n) {
65
+ return following
86
66
  }
87
67
 
88
68
  // Omit 'ett' before 'hundra' and 'tusen'
89
- if (leftNumber === 1n && (rightNumber === 100n || rightNumber === 1000n)) {
90
- return rightPair
69
+ if (precedingValue === 1n && (followingValue === 100n || followingValue === 1000n)) {
70
+ return following
91
71
  }
92
72
 
93
- if (leftNumber < 100n && leftNumber > rightNumber) {
94
- return { [`${leftWord}-${rightWord}`]: leftNumber + rightNumber }
73
+ if (precedingValue < 100n && precedingValue > followingValue) {
74
+ return { [`${precedingWord}-${followingWord}`]: precedingValue + followingValue }
95
75
  }
96
76
 
97
- if (leftNumber >= 100n && rightNumber < 100n) {
98
- return { [`${leftWord} och ${rightWord}`]: leftNumber + rightNumber }
77
+ if (precedingValue >= 100n && followingValue < 100n) {
78
+ return { [`${precedingWord} och ${followingWord}`]: precedingValue + followingValue }
99
79
  }
100
80
 
101
- if (rightNumber > leftNumber) {
102
- if (leftNumber === 1n && rightNumber >= 1_000_000n) {
103
- return { [`en ${rightWord}`]: leftNumber * rightNumber }
81
+ if (followingValue > precedingValue) {
82
+ if (precedingValue === 1n && followingValue >= 1_000_000n) {
83
+ return { [`en ${followingWord}`]: precedingValue * followingValue }
104
84
  }
105
- return { [`${leftWord} ${rightWord}`]: leftNumber * rightNumber }
85
+ return { [`${precedingWord} ${followingWord}`]: precedingValue * followingValue }
106
86
  }
107
87
 
108
- return { [`${leftWord} ${rightWord}`]: leftNumber + rightNumber }
88
+ return { [`${precedingWord} ${followingWord}`]: precedingValue + followingValue }
109
89
  }
110
90
  }
111
-
112
- /**
113
- * Converts a number to Swedish cardinal (written) form.
114
- *
115
- * @param {number|string|bigint} value The number to convert.
116
- * @param {Object} [options] Conversion options (see Swedish class options).
117
- * @returns {string} The number expressed in Swedish words.
118
- * @throws {TypeError} If value is NaN or invalid type.
119
- * @throws {Error} If value is an invalid number string.
120
- *
121
- * @example
122
- * convertToWords(42); // 'fyrtio-två'
123
- * convertToWords('1.5'); // 'ett komma fem'
124
- */
125
- export default function convertToWords (value, options = {}) {
126
- return new Swedish(options).convertToWords(value)
127
- }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Swahili language converter.
3
+ *
4
+ * Supports:
5
+ * - Swahili number words (moja, mbili, tatu)
6
+ * - Space-separated components
7
+ * - Simple decimal point notation
8
+ */
9
+ export class Swahili extends AbstractLanguage {
10
+ onesWords: {
11
+ 0: string;
12
+ 1: string;
13
+ 2: string;
14
+ 3: string;
15
+ 4: string;
16
+ 5: string;
17
+ 6: string;
18
+ 7: string;
19
+ 8: string;
20
+ 9: string;
21
+ };
22
+ tensWords: {
23
+ 10: string;
24
+ 20: string;
25
+ 30: string;
26
+ 40: string;
27
+ 50: string;
28
+ 60: string;
29
+ 70: string;
30
+ 80: string;
31
+ 90: string;
32
+ };
33
+ scaleWords: string[];
34
+ wordsUnder100(n: any): any;
35
+ wordsUnder1000(n: any): any;
36
+ splitBy3(number: any): number[];
37
+ integerToWords(integerPart: any): string;
38
+ }
39
+ import { AbstractLanguage } from '../classes/abstract-language.js';
@@ -1,10 +1,19 @@
1
- import AbstractLanguage from '../classes/abstract-language.js'
1
+ import { AbstractLanguage } from '../classes/abstract-language.js'
2
2
 
3
- class Swahili extends AbstractLanguage {
3
+ /**
4
+ * Swahili language converter.
5
+ *
6
+ * Supports:
7
+ * - Swahili number words (moja, mbili, tatu)
8
+ * - Space-separated components
9
+ * - Simple decimal point notation
10
+ */
11
+ export class Swahili extends AbstractLanguage {
4
12
  negativeWord = 'minus'
5
13
  decimalSeparatorWord = 'nukta'
6
14
  zeroWord = 'sifuri'
7
- digits = {
15
+
16
+ onesWords = {
8
17
  0: 'sifuri',
9
18
  1: 'moja',
10
19
  2: 'mbili',
@@ -17,7 +26,7 @@ class Swahili extends AbstractLanguage {
17
26
  9: 'tisa'
18
27
  }
19
28
 
20
- tens = {
29
+ tensWords = {
21
30
  10: 'kumi',
22
31
  20: 'ishirini',
23
32
  30: 'thelathini',
@@ -29,7 +38,7 @@ class Swahili extends AbstractLanguage {
29
38
  90: 'tisini'
30
39
  }
31
40
 
32
- scales = [
41
+ scaleWords = [
33
42
  '',
34
43
  'elfu',
35
44
  'milioni',
@@ -38,16 +47,16 @@ class Swahili extends AbstractLanguage {
38
47
  ]
39
48
 
40
49
  wordsUnder100 (n) {
41
- if (n < 10) return this.digits[n]
42
- if (n === 10) return this.tens[10]
50
+ if (n < 10) return this.onesWords[n]
51
+ if (n === 10) return this.tensWords[10]
43
52
  if (n < 20) {
44
53
  // 11-19: 'kumi na <digit>'
45
- return this.tens[10] + ' na ' + this.digits[n - 10]
54
+ return this.tensWords[10] + ' na ' + this.onesWords[n - 10]
46
55
  }
47
56
  const tens = Math.trunc(n / 10) * 10
48
57
  const ones = n % 10
49
- if (ones === 0) return this.tens[tens]
50
- return this.tens[tens] + ' na ' + this.digits[ones]
58
+ if (ones === 0) return this.tensWords[tens]
59
+ return this.tensWords[tens] + ' na ' + this.onesWords[ones]
51
60
  }
52
61
 
53
62
  wordsUnder1000 (n) {
@@ -58,10 +67,10 @@ class Swahili extends AbstractLanguage {
58
67
  const parts = []
59
68
 
60
69
  // Hundreds: 'mia <digit>'
61
- parts.push('mia ' + this.digits[hundreds])
70
+ parts.push('mia ' + this.onesWords[hundreds])
62
71
  if (rest > 0) {
63
72
  if (rest < 10) {
64
- parts.push('na ' + this.digits[rest])
73
+ parts.push('na ' + this.onesWords[rest])
65
74
  } else {
66
75
  parts.push(this.wordsUnder100(rest))
67
76
  }
@@ -85,10 +94,10 @@ class Swahili extends AbstractLanguage {
85
94
  return groups
86
95
  }
87
96
 
88
- convertWholePart (number) {
89
- if (number === 0n) return this.zeroWord
97
+ integerToWords (integerPart) {
98
+ if (integerPart === 0n) return this.zeroWord
90
99
 
91
- const groups = this.splitBy3(number)
100
+ const groups = this.splitBy3(integerPart)
92
101
  const parts = []
93
102
 
94
103
  for (let i = 0; i < groups.length; i++) {
@@ -98,7 +107,7 @@ class Swahili extends AbstractLanguage {
98
107
  // scale word
99
108
  if (scaleIndex === 0) {
100
109
  if (val < 10 && parts.length > 0) {
101
- parts.push('na ' + this.digits[val])
110
+ parts.push('na ' + this.onesWords[val])
102
111
  } else if (val === 100 && parts.length > 0) {
103
112
  // In compound numbers (e.g., 1100 -> 'elfu moja mia'), use 'mia' not 'mia moja'
104
113
  parts.push('mia')
@@ -108,14 +117,10 @@ class Swahili extends AbstractLanguage {
108
117
  } else {
109
118
  // e.g., 'elfu moja', 'milioni mbili'
110
119
  const unit = (val === 1) ? 'moja' : this.wordsUnder1000(val)
111
- parts.push(this.scales[scaleIndex] + ' ' + unit)
120
+ parts.push(this.scaleWords[scaleIndex] + ' ' + unit)
112
121
  }
113
122
  }
114
123
 
115
124
  return parts.join(' ').trim()
116
125
  }
117
126
  }
118
-
119
- export default function convertToWords (value, options = {}) {
120
- return new Swahili(options).convertToWords(value)
121
- }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Tamil language converter.
3
+ *
4
+ * Supports:
5
+ * - Tamil numbering system
6
+ * - Tamil script
7
+ * - Complete word forms for 0-99
8
+ */
9
+ export class Tamil extends AbstractLanguage {
10
+ belowHundredWords: string[];
11
+ hundredsWords: string[];
12
+ onesWords: string[];
13
+ scaleWords: string[];
14
+ /** Convert numbers below 100 to Tamil words. */
15
+ convertBelowHundred(number: any): string;
16
+ convertBelowThousand(number: any): string;
17
+ splitIndian(number: any): number[];
18
+ integerToWords(integerPart: any): string;
19
+ }
20
+ import { AbstractLanguage } from '../classes/abstract-language.js';
@@ -1,11 +1,20 @@
1
- import AbstractLanguage from '../classes/abstract-language.js'
2
-
3
- class Tamil extends AbstractLanguage {
1
+ import { AbstractLanguage } from '../classes/abstract-language.js'
2
+
3
+ /**
4
+ * Tamil language converter.
5
+ *
6
+ * Supports:
7
+ * - Tamil numbering system
8
+ * - Tamil script
9
+ * - Complete word forms for 0-99
10
+ */
11
+ export class Tamil extends AbstractLanguage {
4
12
  negativeWord = 'மைனஸ்'
5
13
  decimalSeparatorWord = 'புள்ளி'
6
14
  zeroWord = 'பூஜ்ஜியம்'
7
- convertDecimalsPerDigit = true // Enable digit-by-digit decimal conversion
8
- belowHundred = [
15
+ usePerDigitDecimals = true // Enable digit-by-digit decimal conversion
16
+
17
+ belowHundredWords = [
9
18
  'பூஜ்ஜியம்',
10
19
  'ஒன்று',
11
20
  'இரண்டு',
@@ -108,7 +117,7 @@ class Tamil extends AbstractLanguage {
108
117
  'தொண்ணூற்று ஒன்பது'
109
118
  ]
110
119
 
111
- hundreds = [
120
+ hundredsWords = [
112
121
  '',
113
122
  'நூறு',
114
123
  'இருநூறு',
@@ -121,8 +130,8 @@ class Tamil extends AbstractLanguage {
121
130
  'தொள்ளாயிரம்'
122
131
  ]
123
132
 
124
- // Digits map 1–9 for decimal reading
125
- digits = [
133
+ // Ones words map 1–9 for decimal reading
134
+ onesWords = [
126
135
  'ஒன்று',
127
136
  'இரண்டு',
128
137
  'மூன்று',
@@ -134,7 +143,7 @@ class Tamil extends AbstractLanguage {
134
143
  'ஒன்பது'
135
144
  ]
136
145
 
137
- scales = [
146
+ scaleWords = [
138
147
  '',
139
148
  'ஆயிரம்',
140
149
  'லட்சம்',
@@ -146,14 +155,9 @@ class Tamil extends AbstractLanguage {
146
155
  'சங்கு'
147
156
  ]
148
157
 
149
- /**
150
- * Convert numbers below 100 to Tamil words.
151
- *
152
- * @param {number} number The number to convert (0-99).
153
- * @returns {string} The Tamil representation.
154
- */
158
+ /** Convert numbers below 100 to Tamil words. */
155
159
  convertBelowHundred (number) {
156
- return this.belowHundred[number]
160
+ return this.belowHundredWords[number]
157
161
  }
158
162
 
159
163
  convertBelowThousand (number) {
@@ -162,7 +166,7 @@ class Tamil extends AbstractLanguage {
162
166
 
163
167
  const hundreds = Math.trunc(number / 100)
164
168
  const remainder = number % 100
165
- let hundredPart = this.hundreds[hundreds]
169
+ let hundredPart = this.hundredsWords[hundreds]
166
170
 
167
171
  if (remainder > 0) {
168
172
  if (hundredPart.endsWith('ம்')) {
@@ -198,10 +202,10 @@ class Tamil extends AbstractLanguage {
198
202
  return groups
199
203
  }
200
204
 
201
- convertWholePart (number) {
202
- if (number === 0n) return this.zeroWord
205
+ integerToWords (integerPart) {
206
+ if (integerPart === 0n) return this.zeroWord
203
207
 
204
- const groups = this.splitIndian(number)
208
+ const groups = this.splitIndian(integerPart)
205
209
  const groupCount = groups.length
206
210
  const words = []
207
211
 
@@ -212,15 +216,11 @@ class Tamil extends AbstractLanguage {
212
216
  const scaleIndex = groupCount - i - 1
213
217
  const groupWords = (groupValue === 1 && scaleIndex > 0) ? 'ஒரு' : this.convertBelowThousand(groupValue)
214
218
  words.push(groupWords)
215
- if (scaleIndex > 0 && this.scales[scaleIndex]) {
216
- words.push(this.scales[scaleIndex])
219
+ if (scaleIndex > 0 && this.scaleWords[scaleIndex]) {
220
+ words.push(this.scaleWords[scaleIndex])
217
221
  }
218
222
  }
219
223
 
220
224
  return words.join(' ').trim()
221
225
  }
222
226
  }
223
-
224
- export default function convertToWords (value, options = {}) {
225
- return new Tamil(options).convertToWords(value)
226
- }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Telugu language converter.
3
+ *
4
+ * Supports:
5
+ * - Telugu numbering system
6
+ * - Telugu script
7
+ * - Complete word forms for 0-99
8
+ */
9
+ export class Telugu extends AbstractLanguage {
10
+ belowHundredWords: string[];
11
+ hundredsWords: string[];
12
+ onesWords: string[];
13
+ scaleWords: string[];
14
+ /** Convert numbers below 100 to Telugu words. */
15
+ convertBelowHundred(number: any): string;
16
+ /** Convert numbers below 1000 to Telugu words. */
17
+ convertBelowThousand(number: any): string;
18
+ /** Split a number using Indian-style grouping (3-2-2 digits from right). */
19
+ splitIndian(number: any): number[];
20
+ integerToWords(integerPart: any): string;
21
+ }
22
+ import { AbstractLanguage } from '../classes/abstract-language.js';
@@ -1,11 +1,20 @@
1
- import AbstractLanguage from '../classes/abstract-language.js'
2
-
3
- class Telugu extends AbstractLanguage {
1
+ import { AbstractLanguage } from '../classes/abstract-language.js'
2
+
3
+ /**
4
+ * Telugu language converter.
5
+ *
6
+ * Supports:
7
+ * - Telugu numbering system
8
+ * - Telugu script
9
+ * - Complete word forms for 0-99
10
+ */
11
+ export class Telugu extends AbstractLanguage {
4
12
  negativeWord = 'మైనస్'
5
13
  decimalSeparatorWord = 'పాయింట్'
6
14
  zeroWord = 'సున్నా'
7
- convertDecimalsPerDigit = true // Enable digit-by-digit decimal conversion
8
- belowHundred = [
15
+ usePerDigitDecimals = true // Enable digit-by-digit decimal conversion
16
+
17
+ belowHundredWords = [
9
18
  'సున్నా',
10
19
  'ఒకటి',
11
20
  'రెండు',
@@ -108,7 +117,7 @@ class Telugu extends AbstractLanguage {
108
117
  'తొంభై తొమ్మిది'
109
118
  ]
110
119
 
111
- hundreds = [
120
+ hundredsWords = [
112
121
  '',
113
122
  'వంద',
114
123
  'రెండు వందలు',
@@ -121,8 +130,8 @@ class Telugu extends AbstractLanguage {
121
130
  'తొమ్మిది వందలు'
122
131
  ]
123
132
 
124
- // Digits map 1–9 for decimal reading
125
- digits = [
133
+ // Ones words map 1–9 for decimal reading
134
+ onesWords = [
126
135
  'ఒకటి',
127
136
  'రెండు',
128
137
  'మూడు',
@@ -134,7 +143,7 @@ class Telugu extends AbstractLanguage {
134
143
  'తొమ్మిది'
135
144
  ]
136
145
 
137
- scales = [
146
+ scaleWords = [
138
147
  '',
139
148
  'వెయ్యి',
140
149
  'లక్ష',
@@ -146,29 +155,19 @@ class Telugu extends AbstractLanguage {
146
155
  'శంకు'
147
156
  ]
148
157
 
149
- /**
150
- * Convert numbers below 100 to Telugu words.
151
- *
152
- * @param {number} number The number to convert (0-99).
153
- * @returns {string} The Telugu representation.
154
- */
158
+ /** Convert numbers below 100 to Telugu words. */
155
159
  convertBelowHundred (number) {
156
- return this.belowHundred[number]
160
+ return this.belowHundredWords[number]
157
161
  }
158
162
 
159
- /**
160
- * Convert numbers below 1000 to Telugu words.
161
- *
162
- * @param {number} number The number to convert (0-999).
163
- * @returns {string} The Telugu representation.
164
- */
163
+ /** Convert numbers below 1000 to Telugu words. */
165
164
  convertBelowThousand (number) {
166
165
  if (number === 0) return ''
167
166
  if (number < 100) return this.convertBelowHundred(number)
168
167
 
169
168
  const hundreds = Math.trunc(number / 100)
170
169
  const remainder = number % 100
171
- const parts = [this.hundreds[hundreds]]
170
+ const parts = [this.hundredsWords[hundreds]]
172
171
 
173
172
  if (remainder > 0) {
174
173
  parts.push(this.convertBelowHundred(remainder))
@@ -177,12 +176,7 @@ class Telugu extends AbstractLanguage {
177
176
  return parts.join(' ').trim()
178
177
  }
179
178
 
180
- /**
181
- * Split a number using Indian-style grouping (3-2-2 digits from right).
182
- *
183
- * @param {bigint} number The number to split.
184
- * @returns {number[]} Array of number groups.
185
- */
179
+ /** Split a number using Indian-style grouping (3-2-2 digits from right). */
186
180
  splitIndian (number) {
187
181
  const numStr = number.toString()
188
182
  if (numStr.length <= 3) return [Number(numStr)]
@@ -201,10 +195,10 @@ class Telugu extends AbstractLanguage {
201
195
  return groups
202
196
  }
203
197
 
204
- convertWholePart (number) {
205
- if (number === 0n) return this.zeroWord
198
+ integerToWords (integerPart) {
199
+ if (integerPart === 0n) return this.zeroWord
206
200
 
207
- const groups = this.splitIndian(number)
201
+ const groups = this.splitIndian(integerPart)
208
202
  const groupCount = groups.length
209
203
  const words = []
210
204
 
@@ -215,15 +209,11 @@ class Telugu extends AbstractLanguage {
215
209
  const scaleIndex = groupCount - i - 1
216
210
  const groupWords = (groupValue === 1 && scaleIndex > 0) ? 'ఒక' : this.convertBelowThousand(groupValue)
217
211
  words.push(groupWords)
218
- if (scaleIndex > 0 && this.scales[scaleIndex]) {
219
- words.push(this.scales[scaleIndex])
212
+ if (scaleIndex > 0 && this.scaleWords[scaleIndex]) {
213
+ words.push(this.scaleWords[scaleIndex])
220
214
  }
221
215
  }
222
216
 
223
217
  return words.join(' ').trim()
224
218
  }
225
219
  }
226
-
227
- export default function convertToWords (value, options = {}) {
228
- return new Telugu(options).convertToWords(value)
229
- }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Thai language converter.
3
+ *
4
+ * Supports:
5
+ * - Thai numerals (ศูนย์, หนึ่ง, สอง, สาม)
6
+ * - No word separators (continuous Thai script)
7
+ * - Digit-by-digit decimal reading
8
+ */
9
+ export class Thai extends AbstractLanguage {
10
+ onesWords: string[];
11
+ /** Converts numbers below one million to Thai words. */
12
+ convertBelowMillion(number: any): string;
13
+ /** Split a number into million-sized groups for processing. */
14
+ splitMillionGroups(number: any): number[];
15
+ integerToWords(integerPart: any): string;
16
+ }
17
+ import { AbstractLanguage } from '../classes/abstract-language.js';