n2words 2.0.0 → 3.1.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 (335) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/README.md +86 -188
  3. package/dist/languages/am-Latn.js +3 -0
  4. package/dist/languages/am-Latn.js.map +1 -0
  5. package/dist/languages/am.js +3 -0
  6. package/dist/languages/am.js.map +1 -0
  7. package/dist/languages/ar.js +3 -0
  8. package/dist/languages/ar.js.map +1 -0
  9. package/dist/languages/az.js +3 -0
  10. package/dist/languages/az.js.map +1 -0
  11. package/dist/languages/bn.js +3 -0
  12. package/dist/languages/bn.js.map +1 -0
  13. package/dist/languages/cs.js +3 -0
  14. package/dist/languages/cs.js.map +1 -0
  15. package/dist/languages/da.js +3 -0
  16. package/dist/languages/da.js.map +1 -0
  17. package/dist/languages/de.js +3 -0
  18. package/dist/languages/de.js.map +1 -0
  19. package/dist/languages/el.js +3 -0
  20. package/dist/languages/el.js.map +1 -0
  21. package/dist/languages/en.js +3 -0
  22. package/dist/languages/en.js.map +1 -0
  23. package/dist/languages/es.js +3 -0
  24. package/dist/languages/es.js.map +1 -0
  25. package/dist/languages/fa.js +3 -0
  26. package/dist/languages/fa.js.map +1 -0
  27. package/dist/languages/fi.js +3 -0
  28. package/dist/languages/fi.js.map +1 -0
  29. package/dist/languages/fil.js +3 -0
  30. package/dist/languages/fil.js.map +1 -0
  31. package/dist/languages/fr-BE.js +3 -0
  32. package/dist/languages/fr-BE.js.map +1 -0
  33. package/dist/languages/fr.js +3 -0
  34. package/dist/languages/fr.js.map +1 -0
  35. package/dist/languages/gu.js +3 -0
  36. package/dist/languages/gu.js.map +1 -0
  37. package/dist/languages/ha.js +3 -0
  38. package/dist/languages/ha.js.map +1 -0
  39. package/dist/languages/hbo.js +3 -0
  40. package/dist/languages/hbo.js.map +1 -0
  41. package/dist/languages/he.js +3 -0
  42. package/dist/languages/he.js.map +1 -0
  43. package/dist/languages/hi.js +3 -0
  44. package/dist/languages/hi.js.map +1 -0
  45. package/dist/languages/hr.js +3 -0
  46. package/dist/languages/hr.js.map +1 -0
  47. package/dist/languages/hu.js +3 -0
  48. package/dist/languages/hu.js.map +1 -0
  49. package/dist/languages/id.js +3 -0
  50. package/dist/languages/id.js.map +1 -0
  51. package/dist/languages/it.js +3 -0
  52. package/dist/languages/it.js.map +1 -0
  53. package/dist/languages/ja.js +3 -0
  54. package/dist/languages/ja.js.map +1 -0
  55. package/dist/languages/ka.js +3 -0
  56. package/dist/languages/ka.js.map +1 -0
  57. package/dist/languages/kn.js +3 -0
  58. package/dist/languages/kn.js.map +1 -0
  59. package/dist/languages/ko.js +3 -0
  60. package/dist/languages/ko.js.map +1 -0
  61. package/dist/languages/lt.js +3 -0
  62. package/dist/languages/lt.js.map +1 -0
  63. package/dist/languages/lv.js +3 -0
  64. package/dist/languages/lv.js.map +1 -0
  65. package/dist/languages/mr.js +3 -0
  66. package/dist/languages/mr.js.map +1 -0
  67. package/dist/languages/ms.js +3 -0
  68. package/dist/languages/ms.js.map +1 -0
  69. package/dist/languages/nb.js +3 -0
  70. package/dist/languages/nb.js.map +1 -0
  71. package/dist/languages/nl.js +3 -0
  72. package/dist/languages/nl.js.map +1 -0
  73. package/dist/languages/pa.js +3 -0
  74. package/dist/languages/pa.js.map +1 -0
  75. package/dist/languages/pl.js +3 -0
  76. package/dist/languages/pl.js.map +1 -0
  77. package/dist/languages/pt.js +3 -0
  78. package/dist/languages/pt.js.map +1 -0
  79. package/dist/languages/ro.js +3 -0
  80. package/dist/languages/ro.js.map +1 -0
  81. package/dist/languages/ru.js +3 -0
  82. package/dist/languages/ru.js.map +1 -0
  83. package/dist/languages/sr-Cyrl.js +3 -0
  84. package/dist/languages/sr-Cyrl.js.map +1 -0
  85. package/dist/languages/sr-Latn.js +3 -0
  86. package/dist/languages/sr-Latn.js.map +1 -0
  87. package/dist/languages/sv.js +3 -0
  88. package/dist/languages/sv.js.map +1 -0
  89. package/dist/languages/sw.js +3 -0
  90. package/dist/languages/sw.js.map +1 -0
  91. package/dist/languages/ta.js +3 -0
  92. package/dist/languages/ta.js.map +1 -0
  93. package/dist/languages/te.js +3 -0
  94. package/dist/languages/te.js.map +1 -0
  95. package/dist/languages/th.js +3 -0
  96. package/dist/languages/th.js.map +1 -0
  97. package/dist/languages/tr.js +3 -0
  98. package/dist/languages/tr.js.map +1 -0
  99. package/dist/languages/uk.js +3 -0
  100. package/dist/languages/uk.js.map +1 -0
  101. package/dist/languages/ur.js +3 -0
  102. package/dist/languages/ur.js.map +1 -0
  103. package/dist/languages/vi.js +3 -0
  104. package/dist/languages/vi.js.map +1 -0
  105. package/dist/languages/yo.js +3 -0
  106. package/dist/languages/yo.js.map +1 -0
  107. package/dist/languages/zh-Hans.js +3 -0
  108. package/dist/languages/zh-Hans.js.map +1 -0
  109. package/dist/languages/zh-Hant.js +3 -0
  110. package/dist/languages/zh-Hant.js.map +1 -0
  111. package/dist/n2words.js +2 -2
  112. package/dist/n2words.js.map +1 -1
  113. package/lib/languages/am-Latn.d.ts +7 -0
  114. package/lib/languages/am-Latn.js +159 -0
  115. package/lib/languages/am.d.ts +7 -0
  116. package/lib/languages/am.js +159 -0
  117. package/lib/languages/ar.d.ts +14 -27
  118. package/lib/languages/ar.js +175 -129
  119. package/lib/languages/az.d.ts +4 -9
  120. package/lib/languages/az.js +166 -37
  121. package/lib/languages/bn.d.ts +4 -8
  122. package/lib/languages/bn.js +159 -124
  123. package/lib/languages/cs.d.ts +15 -85
  124. package/lib/languages/cs.js +293 -114
  125. package/lib/languages/da.d.ts +11 -12
  126. package/lib/languages/da.js +269 -101
  127. package/lib/languages/de.d.ts +14 -11
  128. package/lib/languages/de.js +305 -86
  129. package/lib/languages/el.d.ts +11 -11
  130. package/lib/languages/el.js +224 -78
  131. package/lib/languages/en.d.ts +14 -13
  132. package/lib/languages/en.js +228 -72
  133. package/lib/languages/es.d.ts +18 -12
  134. package/lib/languages/es.js +297 -103
  135. package/lib/languages/fa.d.ts +4 -44
  136. package/lib/languages/fa.js +112 -122
  137. package/lib/languages/fi.d.ts +14 -0
  138. package/lib/languages/fi.js +238 -0
  139. package/lib/languages/fil.d.ts +4 -13
  140. package/lib/languages/fil.js +196 -106
  141. package/lib/languages/fr-BE.d.ts +8 -8
  142. package/lib/languages/fr-BE.js +285 -19
  143. package/lib/languages/fr.d.ts +18 -12
  144. package/lib/languages/fr.js +339 -89
  145. package/lib/languages/gu.d.ts +4 -8
  146. package/lib/languages/gu.js +143 -125
  147. package/lib/languages/ha.d.ts +7 -0
  148. package/lib/languages/ha.js +225 -0
  149. package/lib/languages/hbo.d.ts +10 -110
  150. package/lib/languages/hbo.js +245 -214
  151. package/lib/languages/he.d.ts +10 -77
  152. package/lib/languages/he.js +231 -172
  153. package/lib/languages/hi.d.ts +4 -8
  154. package/lib/languages/hi.js +163 -124
  155. package/lib/languages/hr.d.ts +8 -77
  156. package/lib/languages/hr.js +200 -89
  157. package/lib/languages/hu.d.ts +4 -19
  158. package/lib/languages/hu.js +198 -119
  159. package/lib/languages/id.d.ts +4 -34
  160. package/lib/languages/id.js +166 -129
  161. package/lib/languages/it.d.ts +16 -34
  162. package/lib/languages/it.js +307 -97
  163. package/lib/languages/ja.d.ts +14 -14
  164. package/lib/languages/ja.js +221 -111
  165. package/lib/languages/ka.d.ts +17 -0
  166. package/lib/languages/ka.js +291 -0
  167. package/lib/languages/kn.d.ts +4 -8
  168. package/lib/languages/kn.js +143 -35
  169. package/lib/languages/ko.d.ts +11 -11
  170. package/lib/languages/ko.js +250 -49
  171. package/lib/languages/lt.d.ts +15 -67
  172. package/lib/languages/lt.js +287 -122
  173. package/lib/languages/lv.d.ts +15 -67
  174. package/lib/languages/lv.js +288 -106
  175. package/lib/languages/mr.d.ts +4 -8
  176. package/lib/languages/mr.js +143 -125
  177. package/lib/languages/ms.d.ts +4 -28
  178. package/lib/languages/ms.js +166 -116
  179. package/lib/languages/nb.d.ts +11 -9
  180. package/lib/languages/nb.js +272 -87
  181. package/lib/languages/nl.d.ts +23 -13
  182. package/lib/languages/nl.js +299 -133
  183. package/lib/languages/pa.d.ts +4 -8
  184. package/lib/languages/pa.js +151 -124
  185. package/lib/languages/pl.d.ts +19 -77
  186. package/lib/languages/pl.js +294 -87
  187. package/lib/languages/pt.d.ts +14 -26
  188. package/lib/languages/pt.js +272 -92
  189. package/lib/languages/ro.d.ts +15 -155
  190. package/lib/languages/ro.js +219 -235
  191. package/lib/languages/ru.d.ts +8 -82
  192. package/lib/languages/ru.js +239 -90
  193. package/lib/languages/sr-Cyrl.d.ts +8 -77
  194. package/lib/languages/sr-Cyrl.js +197 -89
  195. package/lib/languages/sr-Latn.d.ts +8 -77
  196. package/lib/languages/sr-Latn.js +197 -89
  197. package/lib/languages/sv.d.ts +11 -11
  198. package/lib/languages/sv.js +278 -74
  199. package/lib/languages/sw.d.ts +4 -36
  200. package/lib/languages/sw.js +133 -106
  201. package/lib/languages/ta.d.ts +4 -17
  202. package/lib/languages/ta.js +143 -202
  203. package/lib/languages/te.d.ts +4 -19
  204. package/lib/languages/te.js +133 -196
  205. package/lib/languages/th.d.ts +4 -14
  206. package/lib/languages/th.js +135 -91
  207. package/lib/languages/tr.d.ts +15 -9
  208. package/lib/languages/tr.js +245 -49
  209. package/lib/languages/uk.d.ts +8 -82
  210. package/lib/languages/uk.js +206 -78
  211. package/lib/languages/ur.d.ts +4 -8
  212. package/lib/languages/ur.js +151 -124
  213. package/lib/languages/vi.d.ts +14 -69
  214. package/lib/languages/vi.js +278 -129
  215. package/lib/languages/yo.d.ts +7 -0
  216. package/lib/languages/yo.js +303 -0
  217. package/lib/languages/zh-Hans.d.ts +8 -18
  218. package/lib/languages/zh-Hans.js +163 -92
  219. package/lib/languages/zh-Hant.d.ts +8 -18
  220. package/lib/languages/zh-Hant.js +181 -90
  221. package/lib/n2words.d.ts +55 -209
  222. package/lib/n2words.js +115 -530
  223. package/lib/utils/is-plain-object.d.ts +13 -0
  224. package/lib/utils/is-plain-object.js +17 -0
  225. package/lib/utils/parse-numeric.d.ts +17 -0
  226. package/lib/utils/parse-numeric.js +108 -0
  227. package/lib/utils/validate-options.d.ts +8 -0
  228. package/lib/utils/validate-options.js +16 -0
  229. package/package.json +26 -14
  230. package/dist/ArabicConverter.js +0 -3
  231. package/dist/ArabicConverter.js.map +0 -1
  232. package/dist/AzerbaijaniConverter.js +0 -3
  233. package/dist/AzerbaijaniConverter.js.map +0 -1
  234. package/dist/BanglaConverter.js +0 -3
  235. package/dist/BanglaConverter.js.map +0 -1
  236. package/dist/BiblicalHebrewConverter.js +0 -3
  237. package/dist/BiblicalHebrewConverter.js.map +0 -1
  238. package/dist/CroatianConverter.js +0 -3
  239. package/dist/CroatianConverter.js.map +0 -1
  240. package/dist/CzechConverter.js +0 -3
  241. package/dist/CzechConverter.js.map +0 -1
  242. package/dist/DanishConverter.js +0 -3
  243. package/dist/DanishConverter.js.map +0 -1
  244. package/dist/DutchConverter.js +0 -3
  245. package/dist/DutchConverter.js.map +0 -1
  246. package/dist/EnglishConverter.js +0 -3
  247. package/dist/EnglishConverter.js.map +0 -1
  248. package/dist/FilipinoConverter.js +0 -3
  249. package/dist/FilipinoConverter.js.map +0 -1
  250. package/dist/FrenchBelgiumConverter.js +0 -3
  251. package/dist/FrenchBelgiumConverter.js.map +0 -1
  252. package/dist/FrenchConverter.js +0 -3
  253. package/dist/FrenchConverter.js.map +0 -1
  254. package/dist/GermanConverter.js +0 -3
  255. package/dist/GermanConverter.js.map +0 -1
  256. package/dist/GreekConverter.js +0 -3
  257. package/dist/GreekConverter.js.map +0 -1
  258. package/dist/GujaratiConverter.js +0 -3
  259. package/dist/GujaratiConverter.js.map +0 -1
  260. package/dist/HebrewConverter.js +0 -3
  261. package/dist/HebrewConverter.js.map +0 -1
  262. package/dist/HindiConverter.js +0 -3
  263. package/dist/HindiConverter.js.map +0 -1
  264. package/dist/HungarianConverter.js +0 -3
  265. package/dist/HungarianConverter.js.map +0 -1
  266. package/dist/IndonesianConverter.js +0 -3
  267. package/dist/IndonesianConverter.js.map +0 -1
  268. package/dist/ItalianConverter.js +0 -3
  269. package/dist/ItalianConverter.js.map +0 -1
  270. package/dist/JapaneseConverter.js +0 -3
  271. package/dist/JapaneseConverter.js.map +0 -1
  272. package/dist/KannadaConverter.js +0 -3
  273. package/dist/KannadaConverter.js.map +0 -1
  274. package/dist/KoreanConverter.js +0 -3
  275. package/dist/KoreanConverter.js.map +0 -1
  276. package/dist/LatvianConverter.js +0 -3
  277. package/dist/LatvianConverter.js.map +0 -1
  278. package/dist/LithuanianConverter.js +0 -3
  279. package/dist/LithuanianConverter.js.map +0 -1
  280. package/dist/MalayConverter.js +0 -3
  281. package/dist/MalayConverter.js.map +0 -1
  282. package/dist/MarathiConverter.js +0 -3
  283. package/dist/MarathiConverter.js.map +0 -1
  284. package/dist/NorwegianBokmalConverter.js +0 -3
  285. package/dist/NorwegianBokmalConverter.js.map +0 -1
  286. package/dist/PersianConverter.js +0 -3
  287. package/dist/PersianConverter.js.map +0 -1
  288. package/dist/PolishConverter.js +0 -3
  289. package/dist/PolishConverter.js.map +0 -1
  290. package/dist/PortugueseConverter.js +0 -3
  291. package/dist/PortugueseConverter.js.map +0 -1
  292. package/dist/PunjabiConverter.js +0 -3
  293. package/dist/PunjabiConverter.js.map +0 -1
  294. package/dist/RomanianConverter.js +0 -3
  295. package/dist/RomanianConverter.js.map +0 -1
  296. package/dist/RussianConverter.js +0 -3
  297. package/dist/RussianConverter.js.map +0 -1
  298. package/dist/SerbianCyrillicConverter.js +0 -3
  299. package/dist/SerbianCyrillicConverter.js.map +0 -1
  300. package/dist/SerbianLatinConverter.js +0 -3
  301. package/dist/SerbianLatinConverter.js.map +0 -1
  302. package/dist/SimplifiedChineseConverter.js +0 -3
  303. package/dist/SimplifiedChineseConverter.js.map +0 -1
  304. package/dist/SpanishConverter.js +0 -3
  305. package/dist/SpanishConverter.js.map +0 -1
  306. package/dist/SwahiliConverter.js +0 -3
  307. package/dist/SwahiliConverter.js.map +0 -1
  308. package/dist/SwedishConverter.js +0 -3
  309. package/dist/SwedishConverter.js.map +0 -1
  310. package/dist/TamilConverter.js +0 -3
  311. package/dist/TamilConverter.js.map +0 -1
  312. package/dist/TeluguConverter.js +0 -3
  313. package/dist/TeluguConverter.js.map +0 -1
  314. package/dist/ThaiConverter.js +0 -3
  315. package/dist/ThaiConverter.js.map +0 -1
  316. package/dist/TraditionalChineseConverter.js +0 -3
  317. package/dist/TraditionalChineseConverter.js.map +0 -1
  318. package/dist/TurkishConverter.js +0 -3
  319. package/dist/TurkishConverter.js.map +0 -1
  320. package/dist/UkrainianConverter.js +0 -3
  321. package/dist/UkrainianConverter.js.map +0 -1
  322. package/dist/UrduConverter.js +0 -3
  323. package/dist/UrduConverter.js.map +0 -1
  324. package/dist/VietnameseConverter.js +0 -3
  325. package/dist/VietnameseConverter.js.map +0 -1
  326. package/lib/classes/abstract-language.d.ts +0 -178
  327. package/lib/classes/abstract-language.js +0 -268
  328. package/lib/classes/greedy-scale-language.d.ts +0 -109
  329. package/lib/classes/greedy-scale-language.js +0 -201
  330. package/lib/classes/slavic-language.d.ts +0 -148
  331. package/lib/classes/slavic-language.js +0 -281
  332. package/lib/classes/south-asian-language.d.ts +0 -70
  333. package/lib/classes/south-asian-language.js +0 -154
  334. package/lib/classes/turkic-language.d.ts +0 -26
  335. package/lib/classes/turkic-language.js +0 -59
@@ -1,132 +1,150 @@
1
- import { SouthAsianLanguage } from '../classes/south-asian-language.js'
2
-
3
1
  /**
4
- * Gujarati language converter.
2
+ * Gujarati language converter - Functional Implementation
3
+ *
4
+ * Self-contained module with its own input validation, ready for subpath exports.
5
5
  *
6
- * Supports:
6
+ * Key features:
7
7
  * - Indian numbering system (હજાર, લાખ, કરોડ)
8
8
  * - Gujarati script
9
+ * - 3-2-2 grouping pattern (last 3 digits, then groups of 2)
9
10
  * - Complete word forms for 0-99
11
+ * - Per-digit decimal reading
12
+ */
13
+
14
+ import { parseNumericValue } from '../utils/parse-numeric.js'
15
+
16
+ // ============================================================================
17
+ // Vocabulary
18
+ // ============================================================================
19
+
20
+ const ZERO = 'શૂન્ય'
21
+ const NEGATIVE = 'ઋણ'
22
+ const DECIMAL_SEP = 'દશાંશ'
23
+ const HUNDRED = 'સો'
24
+
25
+ const BELOW_HUNDRED = [
26
+ 'શૂન્ય', 'એક', 'બે', 'ત્રણ', 'ચાર', 'પાંચ', 'છ', 'સાત', 'આઠ', 'નવ',
27
+ 'દસ', 'અગિયાર', 'બાર', 'તેર', 'ચૌદ', 'પંદર', 'સોળ', 'સત્તર', 'અઢાર', 'ઓગણીસ',
28
+ 'વીસ', 'એકવીસ', 'બાવીસ', 'ત્રેવીસ', 'ચોવીસ', 'પચીસ', 'છવ્વીસ', 'સત્તાવીસ', 'અઠ્ઠાવીસ', 'ઓગણત્રીસ',
29
+ 'ત્રીસ', 'એકત્રીસ', 'બત્રીસ', 'તેત્રીસ', 'ચોત્રીસ', 'પાંત્રીસ', 'છત્રીસ', 'સાડત્રીસ', 'અડત્રીસ', 'ઓગણચાલીસ',
30
+ 'ચાલીસ', 'એકતાલીસ', 'બેતાળીસ', 'ત્રેતાળીસ', 'ચુંમાલીસ', 'પિસ્તાલીસ', 'છેતાળીસ', 'સુડતાળીસ', 'અડતાળીસ', 'ઓગણપચાસ',
31
+ 'પચાસ', 'એકાવન', 'બાવન', 'ત્રેપન', 'ચોપન', 'પંચાવન', 'છપ્પન', 'સત્તાવન', 'અઠ્ઠાવન', 'ઓગણસાઠ',
32
+ 'સાઠ', 'એકસઠ', 'બાસઠ', 'ત્રેસઠ', 'ચોસઠ', 'પાંસઠ', 'છાસઠ', 'સડસઠ', 'અડસઠ', 'અગણોસિત્તેર',
33
+ 'સિત્તેર', 'એકોતેર', 'બોતેર', 'તોતેર', 'ચુમોતેર', 'પંચોતેર', 'છોતેર', 'સિત્યોતેર', 'ઇઠ્યોતેર', 'ઓગણાએંસી',
34
+ 'એંસી', 'એક્યાસી', 'બ્યાસી', 'ત્યાસી', 'ચોર્યાસી', 'પંચાસી', 'છ્યાસી', 'સિત્યાસી', 'અઠ્યાસી', 'નેવ્યાસી',
35
+ 'નેવું', 'એકાણું', 'બાણું', 'ત્રાણું', 'ચોરાણું', 'પંચાણું', 'છન્નું', 'સત્તાણું', 'અઠ્ઠાણું', 'નવ્વાણું'
36
+ ]
37
+
38
+ // Scale words: index 0 = units (empty), 1 = thousand, 2 = lakh, 3 = crore, etc.
39
+ const SCALE_WORDS = ['', 'હજાર', 'લાખ', 'કરોડ', 'અબજ', 'ખરબ', 'નીલ', 'પદ્મ', 'શંખ']
40
+
41
+ // ============================================================================
42
+ // Segment Building
43
+ // ============================================================================
44
+
45
+ /**
46
+ * Builds words for a 0-999 segment.
10
47
  */
11
- export class Gujarati extends SouthAsianLanguage {
12
- negativeWord = 'ઋણ'
13
- decimalSeparatorWord = 'દશાંશ'
14
- zeroWord = 'શૂન્ય'
15
- hundredWord = 'સો'
16
- usePerDigitDecimals = true
17
-
18
- belowHundredWords = [
19
- 'શૂન્ય',
20
- 'એક',
21
- 'બે',
22
- 'ત્રણ',
23
- 'ચાર',
24
- 'પાંચ',
25
- 'છ',
26
- 'સાત',
27
- 'આઠ',
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
- scaleWords = [
122
- '',
123
- 'હજાર',
124
- 'લાખ',
125
- 'કરોડ',
126
- 'અબજ',
127
- 'ખરબ',
128
- 'નીલ',
129
- 'પદ્મ',
130
- 'શંખ'
131
- ]
48
+ function buildSegment (n) {
49
+ if (n === 0) return ''
50
+ if (n < 100) return BELOW_HUNDRED[n]
51
+
52
+ const hundreds = Math.trunc(n / 100)
53
+ const remainder = n % 100
54
+
55
+ if (remainder === 0) {
56
+ return BELOW_HUNDRED[hundreds] + ' ' + HUNDRED
57
+ }
58
+ return BELOW_HUNDRED[hundreds] + ' ' + HUNDRED + ' ' + BELOW_HUNDRED[remainder]
132
59
  }
60
+
61
+ // ============================================================================
62
+ // Conversion Functions
63
+ // ============================================================================
64
+
65
+ /**
66
+ * Converts a non-negative integer to Gujarati words.
67
+ *
68
+ * Uses BigInt modulo for segment extraction (faster than string slicing).
69
+ * South Asian 3-2-2 grouping: first 3 digits, then groups of 2.
70
+ *
71
+ * @param {bigint} n - Non-negative integer to convert
72
+ * @returns {string} Gujarati words
73
+ */
74
+ function integerToWords (n) {
75
+ if (n === 0n) return ZERO
76
+
77
+ // Fast path: numbers < 1000 (direct lookup)
78
+ if (n < 1000n) {
79
+ return buildSegment(Number(n))
80
+ }
81
+
82
+ // Extract segments using BigInt modulo
83
+ const segments = []
84
+ segments.push(Number(n % 1000n))
85
+ let temp = n / 1000n
86
+
87
+ while (temp > 0n) {
88
+ segments.push(Number(temp % 100n))
89
+ temp = temp / 100n
90
+ }
91
+
92
+ // Build result string (process from most-significant to least)
93
+ const words = []
94
+ for (let i = segments.length - 1; i >= 0; i--) {
95
+ const segment = segments[i]
96
+ if (segment === 0) continue
97
+
98
+ if (i === 0) {
99
+ words.push(buildSegment(segment))
100
+ } else {
101
+ words.push(BELOW_HUNDRED[segment])
102
+ }
103
+
104
+ if (i > 0 && SCALE_WORDS[i]) {
105
+ words.push(SCALE_WORDS[i])
106
+ }
107
+ }
108
+
109
+ return words.join(' ')
110
+ }
111
+
112
+ function decimalPartToWords (decimalPart) {
113
+ // Per-digit decimal reading
114
+ const digits = []
115
+ for (const char of decimalPart) {
116
+ const d = parseInt(char, 10)
117
+ digits.push(d === 0 ? ZERO : BELOW_HUNDRED[d])
118
+ }
119
+ return digits.join(' ')
120
+ }
121
+
122
+ /**
123
+ * Converts a numeric value to Gujarati words.
124
+ *
125
+ * @param {number | string | bigint} value - The numeric value to convert
126
+ * @returns {string} The number in Gujarati words
127
+ */
128
+ function toWords (value) {
129
+ const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
130
+
131
+ let result = ''
132
+
133
+ if (isNegative) {
134
+ result = NEGATIVE + ' '
135
+ }
136
+
137
+ result += integerToWords(integerPart)
138
+
139
+ if (decimalPart) {
140
+ result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart)
141
+ }
142
+
143
+ return result
144
+ }
145
+
146
+ // ============================================================================
147
+ // Exports
148
+ // ============================================================================
149
+
150
+ export { toWords }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Converts a numeric value to Hausa words.
3
+ *
4
+ * @param {number | string | bigint} value - The numeric value to convert
5
+ * @returns {string} The number in Hausa words
6
+ */
7
+ export function toWords(value: number | string | bigint): string;
@@ -0,0 +1,225 @@
1
+ /**
2
+ * Hausa language converter - Functional Implementation
3
+ *
4
+ * Self-contained module with its own input validation, ready for subpath exports.
5
+ *
6
+ * Key features:
7
+ * - Authentic Boko orthography with ɗ (hooked d) and ' (glottal stop)
8
+ * - Teens with "sha" prefix (sha ɗaya = 11)
9
+ * - Compound numbers with "da" connector (ashirin da ɗaya = 21)
10
+ * - Arabic loanwords for tens (ashirin, talatin, arba'in, etc.)
11
+ * - Reversed multiplier order: "biyu ɗari" (200), "biyu dubu" (2000)
12
+ * - Implicit one before ɗari and dubu
13
+ * - Per-digit decimal reading
14
+ */
15
+
16
+ import { parseNumericValue } from '../utils/parse-numeric.js'
17
+
18
+ // ============================================================================
19
+ // Vocabulary
20
+ // ============================================================================
21
+
22
+ const ONES = ['', 'ɗaya', 'biyu', 'uku', 'huɗu', 'biyar', 'shida', 'bakwai', 'takwas', 'tara']
23
+ const TEENS = ['goma', 'sha ɗaya', 'sha biyu', 'sha uku', 'sha huɗu', 'sha biyar', 'sha shida', 'sha bakwai', 'sha takwas', 'sha tara']
24
+ // Arabic loanwords for tens
25
+ const TENS = ['', '', 'ashirin', 'talatin', "arba'in", 'hamsin', 'sittin', "saba'in", 'tamanin', "tis'in"]
26
+
27
+ const HUNDRED = 'ɗari'
28
+ const THOUSAND = 'dubu'
29
+
30
+ const ZERO = 'sifiri'
31
+ const NEGATIVE = 'babu'
32
+ const DECIMAL_SEP = 'digo'
33
+
34
+ // Short scale
35
+ const SCALE_WORDS = ['', THOUSAND, 'miliyan', 'biliyan']
36
+
37
+ // ============================================================================
38
+ // Precomputed Lookup Table
39
+ // ============================================================================
40
+
41
+ /**
42
+ * Build segment for 0-999 with Hausa patterns.
43
+ * Hausa uses reversed order for hundreds: "biyu ɗari" (200)
44
+ * And "da" connector for ones: "ashirin da ɗaya" (21)
45
+ */
46
+ function buildSegment (n) {
47
+ if (n === 0) return ''
48
+
49
+ const ones = n % 10
50
+ const tensDigit = Math.floor(n / 10) % 10
51
+ const hundredsDigit = Math.floor(n / 100)
52
+
53
+ const parts = []
54
+
55
+ // Hundreds: implicit one, or "biyu ɗari" (reversed order)
56
+ if (hundredsDigit > 0) {
57
+ if (hundredsDigit === 1) {
58
+ parts.push(HUNDRED)
59
+ } else {
60
+ // Reversed: multiplier + hundredWord
61
+ parts.push(ONES[hundredsDigit] + ' ' + HUNDRED)
62
+ }
63
+ }
64
+
65
+ // Tens and ones
66
+ const tensOnes = n % 100
67
+
68
+ if (tensOnes === 0) {
69
+ // Just hundreds
70
+ } else if (tensOnes < 10) {
71
+ // Single digit - with "da" connector if after hundreds
72
+ if (hundredsDigit > 0) {
73
+ parts.push('da ' + ONES[ones])
74
+ } else {
75
+ parts.push(ONES[ones])
76
+ }
77
+ } else if (tensOnes < 20) {
78
+ // Teens (10-19): "sha X"
79
+ parts.push(TEENS[ones])
80
+ } else if (ones === 0) {
81
+ // Even tens (20, 30, 40, etc.)
82
+ parts.push(TENS[tensDigit])
83
+ } else {
84
+ // Tens + ones with "da" connector
85
+ parts.push(TENS[tensDigit] + ' da ' + ONES[ones])
86
+ }
87
+
88
+ return parts.join(' ')
89
+ }
90
+
91
+ // ============================================================================
92
+ // Conversion Functions
93
+ // ============================================================================
94
+
95
+ function integerToWords (n) {
96
+ if (n === 0n) return ZERO
97
+
98
+ if (n < 1000n) {
99
+ return buildSegment(Number(n))
100
+ }
101
+
102
+ return buildLargeNumberWords(n)
103
+ }
104
+
105
+ /**
106
+ * Checks if a word is a single digit (1-9).
107
+ */
108
+ function isSingleDigit (word) {
109
+ return ONES.slice(1).includes(word)
110
+ }
111
+
112
+ function buildLargeNumberWords (n) {
113
+ const numStr = n.toString()
114
+ const len = numStr.length
115
+
116
+ const segments = []
117
+ const segmentSize = 3
118
+
119
+ const remainderLen = len % segmentSize
120
+ let pos = 0
121
+ if (remainderLen > 0) {
122
+ segments.push(Number(numStr.slice(0, remainderLen)))
123
+ pos = remainderLen
124
+ }
125
+ while (pos < len) {
126
+ segments.push(Number(numStr.slice(pos, pos + segmentSize)))
127
+ pos += segmentSize
128
+ }
129
+
130
+ // Build raw parts (segment words and scale words)
131
+ const rawParts = []
132
+ let scaleIndex = segments.length - 1
133
+
134
+ for (let i = 0; i < segments.length; i++) {
135
+ const segment = segments[i]
136
+
137
+ if (segment !== 0) {
138
+ const scaleWord = SCALE_WORDS[scaleIndex] || ''
139
+
140
+ if (scaleIndex === 0) {
141
+ rawParts.push(buildSegment(segment))
142
+ } else {
143
+ rawParts.push(buildSegment(segment))
144
+ rawParts.push(scaleWord)
145
+ }
146
+ }
147
+
148
+ scaleIndex--
149
+ }
150
+
151
+ // Filter out implicit "ɗaya" before ɗari or dubu
152
+ const filtered = []
153
+ for (let i = 0; i < rawParts.length; i++) {
154
+ const part = rawParts[i]
155
+ const nextPart = rawParts[i + 1]
156
+
157
+ // Skip "ɗaya" before ɗari or dubu (implicit one)
158
+ if (part === 'ɗaya' && nextPart && (nextPart === HUNDRED || nextPart === THOUSAND)) {
159
+ continue
160
+ }
161
+
162
+ filtered.push(part)
163
+ }
164
+
165
+ // Join with correct separators
166
+ const result = []
167
+ for (let i = 0; i < filtered.length; i++) {
168
+ const part = filtered[i]
169
+ const prevPart = i > 0 ? filtered[i - 1] : null
170
+
171
+ // Determine if we need "da" connector
172
+ // Use "da" when current is a single digit following a scale word
173
+ if (prevPart && isSingleDigit(part) &&
174
+ (prevPart === THOUSAND || prevPart === HUNDRED ||
175
+ SCALE_WORDS.includes(prevPart))) {
176
+ result.push(' da ')
177
+ } else if (i > 0) {
178
+ result.push(' ')
179
+ }
180
+
181
+ result.push(part)
182
+ }
183
+
184
+ return result.join('')
185
+ }
186
+
187
+ function decimalPartToWords (decimalPart) {
188
+ // Per-digit decimal reading
189
+ const digits = []
190
+ for (const char of decimalPart) {
191
+ const d = parseInt(char, 10)
192
+ digits.push(d === 0 ? ZERO : ONES[d])
193
+ }
194
+ return digits.join(' ')
195
+ }
196
+
197
+ /**
198
+ * Converts a numeric value to Hausa words.
199
+ *
200
+ * @param {number | string | bigint} value - The numeric value to convert
201
+ * @returns {string} The number in Hausa words
202
+ */
203
+ function toWords (value) {
204
+ const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
205
+
206
+ let result = ''
207
+
208
+ if (isNegative) {
209
+ result = NEGATIVE + ' '
210
+ }
211
+
212
+ result += integerToWords(integerPart)
213
+
214
+ if (decimalPart) {
215
+ result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart)
216
+ }
217
+
218
+ return result
219
+ }
220
+
221
+ // ============================================================================
222
+ // Exports
223
+ // ============================================================================
224
+
225
+ export { toWords }
@@ -1,113 +1,13 @@
1
1
  /**
2
- * Biblical Hebrew language converter.
2
+ * Converts a numeric value to Biblical Hebrew words.
3
3
  *
4
- * Supports:
5
- * - Three-form pluralization (one/few/many)
6
- * - Gender agreement (masculine/feminine)
7
- * - Optional "ו" (and) conjunction control
4
+ * @param {number | string | bigint} value - The numeric value to convert
5
+ * @param {Object} [options] - Optional configuration
6
+ * @param {('masculine'|'feminine')} [options.gender='masculine'] - Grammatical gender
7
+ * @param {string} [options.andWord] - Custom conjunction word
8
+ * @returns {string} The number in Biblical Hebrew words
8
9
  */
9
- export class BiblicalHebrew extends SlavicLanguage {
10
- constructor(options?: {});
11
- onesWords: {
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
- teensWords: {
23
- 0: string;
24
- 1: string;
25
- 2: string;
26
- 3: string;
27
- 4: string;
28
- 5: string;
29
- 6: string;
30
- 7: string;
31
- 8: string;
32
- 9: string;
33
- };
34
- twentiesWords: {
35
- 2: string;
36
- 3: string;
37
- 4: string;
38
- 5: string;
39
- 6: string;
40
- 7: string;
41
- 8: string;
42
- 9: string;
43
- };
44
- hundredsWords: {
45
- 1: string;
46
- 2: string;
47
- 3: string;
48
- };
49
- pluralForms: {
50
- 1: string;
51
- 2: string;
52
- 3: string;
53
- 4: string;
54
- 5: string;
55
- 6: string;
56
- 7: string;
57
- 8: string;
58
- 9: string;
59
- };
60
- femininePluralForms: {
61
- 1: string;
62
- 2: string;
63
- 3: string;
64
- 4: string;
65
- 5: string;
66
- 6: string;
67
- 7: string;
68
- 8: string;
69
- 9: string;
70
- };
71
- scale: {
72
- 1: string;
73
- 2: string;
74
- 3: string;
75
- 4: string;
76
- 5: string;
77
- 6: string;
78
- };
79
- scalePlural: {
80
- 1: string;
81
- 2: string;
82
- 3: string;
83
- 4: string;
84
- 5: string;
85
- 6: string;
86
- };
87
- onesFeminineWords: {
88
- 1: string;
89
- 2: string;
90
- 3: string;
91
- 4: string;
92
- 5: string;
93
- 6: string;
94
- 7: string;
95
- 8: string;
96
- 9: string;
97
- };
98
- teensFeminineWords: {
99
- 0: string;
100
- 1: string;
101
- 2: string;
102
- 3: string;
103
- 4: string;
104
- 5: string;
105
- 6: string;
106
- 7: string;
107
- 8: string;
108
- 9: string;
109
- };
110
- /** Converts integer part with Biblical Hebrew three-form pluralization. */
111
- integerToWords(integerPart: any): string;
112
- }
113
- import { SlavicLanguage } from '../classes/slavic-language.js';
10
+ export function toWords(value: number | string | bigint, options?: {
11
+ gender?: "masculine" | "feminine" | undefined;
12
+ andWord?: string | undefined;
13
+ }): string;