n2words 1.24.0 → 3.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 (280) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/README.md +183 -156
  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 -2
  8. package/dist/languages/ar.js.map +1 -1
  9. package/dist/languages/az.js +3 -2
  10. package/dist/languages/az.js.map +1 -1
  11. package/dist/languages/bn.js +3 -2
  12. package/dist/languages/bn.js.map +1 -1
  13. package/dist/languages/cs.js +3 -2
  14. package/dist/languages/cs.js.map +1 -1
  15. package/dist/languages/da.js +3 -2
  16. package/dist/languages/da.js.map +1 -1
  17. package/dist/languages/de.js +3 -2
  18. package/dist/languages/de.js.map +1 -1
  19. package/dist/languages/el.js +3 -2
  20. package/dist/languages/el.js.map +1 -1
  21. package/dist/languages/en.js +3 -2
  22. package/dist/languages/en.js.map +1 -1
  23. package/dist/languages/es.js +3 -2
  24. package/dist/languages/es.js.map +1 -1
  25. package/dist/languages/fa.js +3 -2
  26. package/dist/languages/fa.js.map +1 -1
  27. package/dist/languages/fi.js +3 -0
  28. package/dist/languages/fi.js.map +1 -0
  29. package/dist/languages/fil.js +3 -2
  30. package/dist/languages/fil.js.map +1 -1
  31. package/dist/languages/fr-BE.js +3 -2
  32. package/dist/languages/fr-BE.js.map +1 -1
  33. package/dist/languages/fr.js +3 -2
  34. package/dist/languages/fr.js.map +1 -1
  35. package/dist/languages/gu.js +3 -2
  36. package/dist/languages/gu.js.map +1 -1
  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 -2
  42. package/dist/languages/he.js.map +1 -1
  43. package/dist/languages/hi.js +3 -2
  44. package/dist/languages/hi.js.map +1 -1
  45. package/dist/languages/hr.js +3 -2
  46. package/dist/languages/hr.js.map +1 -1
  47. package/dist/languages/hu.js +3 -2
  48. package/dist/languages/hu.js.map +1 -1
  49. package/dist/languages/id.js +3 -2
  50. package/dist/languages/id.js.map +1 -1
  51. package/dist/languages/it.js +3 -2
  52. package/dist/languages/it.js.map +1 -1
  53. package/dist/languages/ja.js +3 -2
  54. package/dist/languages/ja.js.map +1 -1
  55. package/dist/languages/kn.js +3 -2
  56. package/dist/languages/kn.js.map +1 -1
  57. package/dist/languages/ko.js +3 -2
  58. package/dist/languages/ko.js.map +1 -1
  59. package/dist/languages/lt.js +3 -2
  60. package/dist/languages/lt.js.map +1 -1
  61. package/dist/languages/lv.js +3 -2
  62. package/dist/languages/lv.js.map +1 -1
  63. package/dist/languages/mr.js +3 -2
  64. package/dist/languages/mr.js.map +1 -1
  65. package/dist/languages/ms.js +3 -2
  66. package/dist/languages/ms.js.map +1 -1
  67. package/dist/languages/nb.js +3 -2
  68. package/dist/languages/nb.js.map +1 -1
  69. package/dist/languages/nl.js +3 -2
  70. package/dist/languages/nl.js.map +1 -1
  71. package/dist/languages/pa.js +3 -0
  72. package/dist/languages/pa.js.map +1 -0
  73. package/dist/languages/pl.js +3 -2
  74. package/dist/languages/pl.js.map +1 -1
  75. package/dist/languages/pt.js +3 -2
  76. package/dist/languages/pt.js.map +1 -1
  77. package/dist/languages/ro.js +3 -2
  78. package/dist/languages/ro.js.map +1 -1
  79. package/dist/languages/ru.js +3 -2
  80. package/dist/languages/ru.js.map +1 -1
  81. package/dist/languages/sr-Cyrl.js +3 -0
  82. package/dist/languages/sr-Cyrl.js.map +1 -0
  83. package/dist/languages/sr-Latn.js +3 -2
  84. package/dist/languages/sr-Latn.js.map +1 -1
  85. package/dist/languages/sv.js +3 -2
  86. package/dist/languages/sv.js.map +1 -1
  87. package/dist/languages/sw.js +3 -2
  88. package/dist/languages/sw.js.map +1 -1
  89. package/dist/languages/ta.js +3 -2
  90. package/dist/languages/ta.js.map +1 -1
  91. package/dist/languages/te.js +3 -2
  92. package/dist/languages/te.js.map +1 -1
  93. package/dist/languages/th.js +3 -2
  94. package/dist/languages/th.js.map +1 -1
  95. package/dist/languages/tr.js +3 -2
  96. package/dist/languages/tr.js.map +1 -1
  97. package/dist/languages/uk.js +3 -2
  98. package/dist/languages/uk.js.map +1 -1
  99. package/dist/languages/ur.js +3 -2
  100. package/dist/languages/ur.js.map +1 -1
  101. package/dist/languages/vi.js +3 -2
  102. package/dist/languages/vi.js.map +1 -1
  103. package/dist/languages/zh-Hans.js +3 -2
  104. package/dist/languages/zh-Hans.js.map +1 -1
  105. package/dist/languages/zh-Hant.js +3 -0
  106. package/dist/languages/zh-Hant.js.map +1 -0
  107. package/dist/n2words.js +3 -2
  108. package/dist/n2words.js.map +1 -1
  109. package/lib/languages/am-Latn.d.ts +7 -0
  110. package/lib/languages/am-Latn.js +164 -0
  111. package/lib/languages/am.d.ts +7 -0
  112. package/lib/languages/am.js +164 -0
  113. package/lib/languages/ar.d.ts +17 -0
  114. package/lib/languages/ar.js +171 -209
  115. package/lib/languages/az.d.ts +7 -0
  116. package/lib/languages/az.js +167 -49
  117. package/lib/languages/bn.d.ts +7 -0
  118. package/lib/languages/bn.js +142 -123
  119. package/lib/languages/cs.d.ts +18 -0
  120. package/lib/languages/cs.js +303 -176
  121. package/lib/languages/da.d.ts +14 -0
  122. package/lib/languages/da.js +267 -139
  123. package/lib/languages/de.d.ts +17 -0
  124. package/lib/languages/de.js +310 -113
  125. package/lib/languages/el.d.ts +14 -0
  126. package/lib/languages/el.js +225 -98
  127. package/lib/languages/en.d.ts +17 -0
  128. package/lib/languages/en.js +235 -102
  129. package/lib/languages/es.d.ts +21 -0
  130. package/lib/languages/es.js +307 -125
  131. package/lib/languages/fa.d.ts +7 -0
  132. package/lib/languages/fa.js +115 -108
  133. package/lib/languages/fi.d.ts +14 -0
  134. package/lib/languages/fi.js +245 -0
  135. package/lib/languages/fil.d.ts +7 -0
  136. package/lib/languages/fil.js +199 -139
  137. package/lib/languages/fr-BE.d.ts +11 -0
  138. package/lib/languages/fr-BE.js +287 -48
  139. package/lib/languages/fr.d.ts +21 -0
  140. package/lib/languages/fr.js +343 -119
  141. package/lib/languages/gu.d.ts +7 -0
  142. package/lib/languages/gu.js +125 -144
  143. package/lib/languages/ha.d.ts +7 -0
  144. package/lib/languages/ha.js +230 -0
  145. package/lib/languages/hbo.d.ts +13 -0
  146. package/lib/languages/hbo.js +300 -0
  147. package/lib/languages/he.d.ts +13 -0
  148. package/lib/languages/he.js +230 -283
  149. package/lib/languages/hi.d.ts +7 -0
  150. package/lib/languages/hi.js +142 -123
  151. package/lib/languages/hr.d.ts +11 -0
  152. package/lib/languages/hr.js +190 -129
  153. package/lib/languages/hu.d.ts +7 -0
  154. package/lib/languages/hu.js +194 -133
  155. package/lib/languages/id.d.ts +7 -0
  156. package/lib/languages/id.js +167 -140
  157. package/lib/languages/it.d.ts +19 -0
  158. package/lib/languages/it.js +337 -108
  159. package/lib/languages/ja.d.ts +17 -0
  160. package/lib/languages/ja.js +224 -155
  161. package/lib/languages/kn.d.ts +7 -0
  162. package/lib/languages/kn.js +128 -62
  163. package/lib/languages/ko.d.ts +14 -0
  164. package/lib/languages/ko.js +250 -70
  165. package/lib/languages/lt.d.ts +18 -0
  166. package/lib/languages/lt.js +287 -148
  167. package/lib/languages/lv.d.ts +18 -0
  168. package/lib/languages/lv.js +291 -123
  169. package/lib/languages/mr.d.ts +7 -0
  170. package/lib/languages/mr.js +125 -144
  171. package/lib/languages/ms.d.ts +7 -0
  172. package/lib/languages/ms.js +171 -112
  173. package/lib/languages/nb.d.ts +14 -0
  174. package/lib/languages/nb.js +275 -100
  175. package/lib/languages/nl.d.ts +26 -0
  176. package/lib/languages/nl.js +307 -174
  177. package/lib/languages/pa.d.ts +7 -0
  178. package/lib/languages/pa.js +163 -0
  179. package/lib/languages/pl.d.ts +22 -0
  180. package/lib/languages/pl.js +299 -158
  181. package/lib/languages/pt.d.ts +17 -0
  182. package/lib/languages/pt.js +279 -120
  183. package/lib/languages/ro.d.ts +18 -0
  184. package/lib/languages/ro.js +214 -337
  185. package/lib/languages/ru.d.ts +11 -0
  186. package/lib/languages/ru.js +219 -95
  187. package/lib/languages/sr-Cyrl.d.ts +11 -0
  188. package/lib/languages/sr-Cyrl.js +215 -0
  189. package/lib/languages/sr-Latn.d.ts +11 -0
  190. package/lib/languages/sr-Latn.js +190 -132
  191. package/lib/languages/sv.d.ts +14 -0
  192. package/lib/languages/sv.js +280 -103
  193. package/lib/languages/sw.d.ts +7 -0
  194. package/lib/languages/sw.js +135 -103
  195. package/lib/languages/ta.d.ts +7 -0
  196. package/lib/languages/ta.js +133 -205
  197. package/lib/languages/te.d.ts +7 -0
  198. package/lib/languages/te.js +148 -213
  199. package/lib/languages/th.d.ts +7 -0
  200. package/lib/languages/th.js +139 -101
  201. package/lib/languages/tr.d.ts +18 -0
  202. package/lib/languages/tr.js +246 -66
  203. package/lib/languages/uk.d.ts +11 -0
  204. package/lib/languages/uk.js +197 -101
  205. package/lib/languages/ur.d.ts +7 -0
  206. package/lib/languages/ur.js +160 -123
  207. package/lib/languages/vi.d.ts +17 -0
  208. package/lib/languages/vi.js +287 -164
  209. package/lib/languages/zh-Hans.d.ts +11 -0
  210. package/lib/languages/zh-Hans.js +159 -142
  211. package/lib/languages/zh-Hant.d.ts +11 -0
  212. package/lib/languages/zh-Hant.js +202 -0
  213. package/lib/n2words.d.ts +53 -0
  214. package/lib/n2words.js +91 -227
  215. package/lib/utils/is-plain-object.d.ts +13 -0
  216. package/lib/utils/is-plain-object.js +17 -0
  217. package/lib/utils/parse-numeric.d.ts +17 -0
  218. package/lib/utils/parse-numeric.js +108 -0
  219. package/lib/utils/validate-options.d.ts +8 -0
  220. package/lib/utils/validate-options.js +16 -0
  221. package/package.json +118 -67
  222. package/dist/languages/pa-Guru.js +0 -2
  223. package/dist/languages/pa-Guru.js.map +0 -1
  224. package/lib/classes/abstract-language.js +0 -261
  225. package/lib/classes/greedy-scale-language.js +0 -195
  226. package/lib/classes/slavic-language.js +0 -251
  227. package/lib/classes/south-asian-language.js +0 -161
  228. package/lib/classes/turkic-language.js +0 -63
  229. package/lib/languages/pa-Guru.js +0 -126
  230. package/typings/classes/abstract-language.d.ts +0 -144
  231. package/typings/classes/greedy-scale-language.d.ts +0 -148
  232. package/typings/classes/slavic-language.d.ts +0 -145
  233. package/typings/classes/south-asian-language.d.ts +0 -101
  234. package/typings/classes/turkic-language.d.ts +0 -42
  235. package/typings/languages/ar.d.ts +0 -93
  236. package/typings/languages/az.d.ts +0 -25
  237. package/typings/languages/bn.d.ts +0 -1
  238. package/typings/languages/cs.d.ts +0 -120
  239. package/typings/languages/da.d.ts +0 -53
  240. package/typings/languages/de.d.ts +0 -26
  241. package/typings/languages/el.d.ts +0 -11
  242. package/typings/languages/en.d.ts +0 -30
  243. package/typings/languages/es.d.ts +0 -43
  244. package/typings/languages/fa.d.ts +0 -81
  245. package/typings/languages/fil.d.ts +0 -12
  246. package/typings/languages/fr-BE.d.ts +0 -41
  247. package/typings/languages/fr.d.ts +0 -43
  248. package/typings/languages/gu.d.ts +0 -12
  249. package/typings/languages/he.d.ts +0 -197
  250. package/typings/languages/hi.d.ts +0 -1
  251. package/typings/languages/hr.d.ts +0 -110
  252. package/typings/languages/hu.d.ts +0 -37
  253. package/typings/languages/id.d.ts +0 -69
  254. package/typings/languages/it.d.ts +0 -51
  255. package/typings/languages/ja.d.ts +0 -58
  256. package/typings/languages/kn.d.ts +0 -11
  257. package/typings/languages/ko.d.ts +0 -25
  258. package/typings/languages/lt.d.ts +0 -110
  259. package/typings/languages/lv.d.ts +0 -99
  260. package/typings/languages/mr.d.ts +0 -12
  261. package/typings/languages/ms.d.ts +0 -37
  262. package/typings/languages/nb.d.ts +0 -27
  263. package/typings/languages/nl.d.ts +0 -65
  264. package/typings/languages/pa-Guru.d.ts +0 -1
  265. package/typings/languages/pl.d.ts +0 -116
  266. package/typings/languages/pt.d.ts +0 -39
  267. package/typings/languages/ro.d.ts +0 -229
  268. package/typings/languages/ru.d.ts +0 -108
  269. package/typings/languages/sr-Latn.d.ts +0 -98
  270. package/typings/languages/sv.d.ts +0 -30
  271. package/typings/languages/sw.d.ts +0 -1
  272. package/typings/languages/ta.d.ts +0 -1
  273. package/typings/languages/te.d.ts +0 -1
  274. package/typings/languages/th.d.ts +0 -1
  275. package/typings/languages/tr.d.ts +0 -46
  276. package/typings/languages/uk.d.ts +0 -117
  277. package/typings/languages/ur.d.ts +0 -1
  278. package/typings/languages/vi.d.ts +0 -116
  279. package/typings/languages/zh-Hans.d.ts +0 -57
  280. package/typings/n2words.d.ts +0 -177
@@ -1,145 +0,0 @@
1
- export default SlavicLanguage;
2
- /**
3
- * Array of three plural forms for Slavic languages:
4
- * - [0]: Singular form (for numbers ending in 1, except 11)
5
- * - [1]: Few form (for numbers ending in 2-4, except 12-14)
6
- * - [2]: Many form (for all other numbers: 0, 5-20, and numbers ending in 0, 5-9, 11-19)
7
- */
8
- export type SlavicPluralForms = string[];
9
- /**
10
- * Mapping from power indices to their plural forms.
11
- * Example: { '0': ['тысяча', 'тысячи', 'тысяч'], '1': ['миллион', 'миллиона', 'миллионов'] }
12
- */
13
- export type SlavicThousandsMap = {
14
- [x: string]: SlavicPluralForms;
15
- };
16
- /**
17
- * @typedef {string[]} SlavicPluralForms
18
- * Array of three plural forms for Slavic languages:
19
- * - [0]: Singular form (for numbers ending in 1, except 11)
20
- * - [1]: Few form (for numbers ending in 2-4, except 12-14)
21
- * - [2]: Many form (for all other numbers: 0, 5-20, and numbers ending in 0, 5-9, 11-19)
22
- */
23
- /**
24
- * @typedef {Object.<string, SlavicPluralForms>} SlavicThousandsMap
25
- * Mapping from power indices to their plural forms.
26
- * Example: { '0': ['тысяча', 'тысячи', 'тысяч'], '1': ['миллион', 'миллиона', 'миллионов'] }
27
- */
28
- /**
29
- * Base class for Slavic and related languages with complex pluralization.
30
- *
31
- * This class provides a reusable implementation for languages that share:
32
- * - Three-form pluralization (singular/few/many)
33
- * - Gender-aware number forms (masculine/feminine for 1, 2)
34
- * - Hundreds, tens, ones decomposition
35
- * - Chunk-based large number handling (thousands, millions, etc.)
36
- * - Inherits decimal handling from AbstractLanguage (supports both grouped and
37
- * per-digit modes via the `convertDecimalsPerDigit` class property).
38
- *
39
- * Used by: Russian, Czech, Polish, Ukrainian, Serbian, Croatian,
40
- * as well as Baltic (Lithuanian, Latvian) and Hebrew languages.
41
- *
42
- * Subclasses MUST define these properties with language-specific vocabulary:
43
- * - `ones` - Object mapping 1-9 to masculine forms
44
- * - `onesFeminine` - Object mapping 1-9 to feminine forms
45
- * - `tens` - Object mapping 0-9 to teen numbers (10-19)
46
- * - `twenties` - Object mapping 2-9 to tens (20-90)
47
- * - `hundreds` - Object mapping 1-9 to hundreds (100-900)
48
- * - `thousands` - Object mapping power indices to [singular, few, many] forms
49
- * - `feminine` - Boolean indicating if feminine forms should be used (optional)
50
- *
51
- * @abstract
52
- * @extends AbstractLanguage
53
- */
54
- declare class SlavicLanguage extends AbstractLanguage {
55
- /**
56
- * Initializes the Slavic language converter with language-specific options.
57
- *
58
- * @param {Object} [options={}] Configuration options.
59
- * @param {boolean} [options.feminine=false] Use feminine forms for numbers (affects gender agreement).
60
- */
61
- constructor({ feminine }?: {
62
- feminine?: boolean;
63
- });
64
- /**
65
- * Masculine forms for digits 1-9.
66
- *
67
- * @type {object}
68
- */
69
- ones: object;
70
- /**
71
- * Feminine forms for digits 1-9.
72
- *
73
- * @type {object}
74
- */
75
- onesFeminine: object;
76
- /**
77
- * Words for tens (10, 20, 30, etc.).
78
- *
79
- * @type {object}
80
- */
81
- tens: object;
82
- /**
83
- * Special forms for 21-29 in some languages.
84
- *
85
- * @type {object}
86
- */
87
- twenties: object;
88
- /**
89
- * Words for hundreds (100, 200, 300, etc.).
90
- *
91
- * @type {object}
92
- */
93
- hundreds: object;
94
- /**
95
- * Scale words for thousands, millions, etc.
96
- *
97
- * @type {object}
98
- */
99
- thousands: object;
100
- /**
101
- * Use feminine forms for numbers (affects 1-9).
102
- *
103
- * @type {boolean}
104
- */
105
- feminine: boolean;
106
- /**
107
- * Splits a number string into chunks of X digits.
108
- *
109
- * Example: splitByX('1234567', 3) => [1n, 234n, 567n]
110
- *
111
- * @param {string} numberString The number as a string.
112
- * @param {number} chunkSize Chunk size (typically 3 for thousands grouping).
113
- * @returns {bigint[]} Array of BigInt chunks.
114
- */
115
- splitByX(numberString: string, chunkSize: number): bigint[];
116
- /**
117
- * Extracts individual digits from a number (units, tens, hundreds).
118
- *
119
- * Returns digits in reverse order: [ones, tens, hundreds]
120
- * Example: 456 => [6n, 5n, 4n]
121
- *
122
- * @param {bigint} value The number to extract digits from (0-999).
123
- * @returns {bigint[]} Array of [ones, tens, hundreds] as BigInts.
124
- */
125
- getDigits(value: bigint): bigint[];
126
- /**
127
- * Selects the correct plural form based on Slavic pluralization rules.
128
- *
129
- * Slavic languages use three forms:
130
- * - Form 0 (singular): numbers ending in 1 (but not 11)
131
- * - Form 1 (few): numbers ending in 2-4 (but not 12-14)
132
- * - Form 2 (many): all other numbers (0, 5-20, 25-30, etc.)
133
- *
134
- * Examples (Russian):
135
- * - 1, 21, 31... => тысяча (form 0)
136
- * - 2-4, 22-24, 32-34... => тысячи (form 1)
137
- * - 0, 5-20, 25-30... => тысяч (form 2)
138
- *
139
- * @param {bigint} n The number to check.
140
- * @param {string[]} forms Array of [singular, few, many] forms.
141
- * @returns {string} The appropriate form for the number.
142
- */
143
- pluralize(number: any, pluralForms: any): string;
144
- }
145
- import AbstractLanguage from './abstract-language.js';
@@ -1,101 +0,0 @@
1
- export default SouthAsianLanguage;
2
- /**
3
- * Array of scale words for the Indian numbering system, in ascending order.
4
- * - Index 0: Usually empty/unused (ones place)
5
- * - Index 1: Thousands (hazaar/হাজার/हजार)
6
- * - Index 2: Lakhs (lakh/লাখ/लाख)
7
- * - Index 3: Crores (crore/কোটি/करोड़)
8
- * - Index 4: Arabs (arab/আরব/अरब)
9
- * Each index i represents the scale word for groups at position i in the Indian system.
10
- */
11
- export type SouthAsianScaleWords = Array<string>;
12
- /**
13
- * Array of words for numbers 0-99, indexed directly.
14
- * belowHundred[0] = word for 0, belowHundred[42] = word for 42, etc.
15
- */
16
- export type SouthAsianBelowHundred = Array<string>;
17
- /**
18
- * @typedef {Array<string>} SouthAsianScaleWords
19
- * Array of scale words for the Indian numbering system, in ascending order.
20
- * - Index 0: Usually empty/unused (ones place)
21
- * - Index 1: Thousands (hazaar/হাজার/हजार)
22
- * - Index 2: Lakhs (lakh/লাখ/लाख)
23
- * - Index 3: Crores (crore/কোটি/करोड़)
24
- * - Index 4: Arabs (arab/আরব/अरब)
25
- * Each index i represents the scale word for groups at position i in the Indian system.
26
- */
27
- /**
28
- * @typedef {Array<string>} SouthAsianBelowHundred
29
- * Array of words for numbers 0-99, indexed directly.
30
- * belowHundred[0] = word for 0, belowHundred[42] = word for 42, etc.
31
- */
32
- /**
33
- * Base class for South Asian languages with shared grouping patterns.
34
- *
35
- * This class provides a reusable implementation for South Asian languages that share:
36
- * - Indian-style number grouping: last 3 digits, then 2-2 (1,23,45,67,89)
37
- * - Lakh (100,000), Crore (10,000,000), Arab (1,000,000,000) scale words
38
- * - Standard negative and decimal handling (inherits AbstractLanguage decimal logic,
39
- * including `convertDecimalsPerDigit` support when set by subclasses)
40
- *
41
- * Used by: Hindi (hi), Bengali (bn), Urdu (ur), Punjabi (pa), Marathi (mr), Gujarati (gu), Kannada (kn)
42
- *
43
- * Subclasses MUST define language-specific vocabulary via class properties:
44
- * - `belowHundred` array with digit and teen words (0-99)
45
- * - `hundredWord` string used inside `convertBelowThousand`
46
- * - `scaleWords` array with grouping words (hazaar, lakh, crore, etc.) indexed by grouping level
47
- * - `negativeWord`, `decimalSeparatorWord`, `zeroWord`, `wordSeparator`
48
- *
49
- * @abstract
50
- * @extends AbstractLanguage
51
- */
52
- declare class SouthAsianLanguage extends AbstractLanguage {
53
- /**
54
- * Array of words for numbers 0-99 (digits and teens).
55
- * Index directly: belowHundred[0] through belowHundred[99].
56
- * @type {Array<string>}
57
- */
58
- belowHundred: Array<string>;
59
- /**
60
- * Word for "hundred" in the language (e.g., 'सौ' in Hindi, 'শত' in Bengali).
61
- * Used to construct hundreds (e.g., "1 hundred", "2 hundred").
62
- * @type {string}
63
- */
64
- hundredWord: string;
65
- /**
66
- * Array of scale words for Indian-style grouping (hazaar, lakh, crore, arab, etc.).
67
- * Index 0 is typically unused (ones place, no scale word).
68
- * Index 1 is for thousands, Index 2 for lakhs, Index 3 for crores, etc.
69
- * @type {Array<string>}
70
- */
71
- scaleWords: Array<string>;
72
- /**
73
- * Split a number into Indian numbering system groups.
74
- *
75
- * The Indian system groups differently than Western (3-3-3) systems:
76
- * - First group (rightmost): Up to 3 digits (ones, tens, hundreds)
77
- * - Subsequent groups: Exactly 2 digits each (thousands, lakhs, crores, etc.)
78
- *
79
- * This creates the familiar Indian comma pattern: 1,23,45,67,890
80
- *
81
- * @protected
82
- * @param {bigint} number The number to split into groups
83
- * @returns {Array<number>} Array of groups from most significant to least significant
84
- *
85
- * @example
86
- * // splitToGroups(1234567n) → [12, 34, 567]
87
- * // Reads as: 12 lakhs, 34 thousands, 567 units
88
- * // splitToGroups(98765432n) → [9, 87, 65, 432]
89
- * // Reads as: 9 crores, 87 lakhs, 65 thousands, 432 units
90
- */
91
- protected splitToGroups(number: bigint): Array<number>;
92
- /**
93
- * Convert a number below 1000 to words (0-999).
94
- *
95
- * @protected
96
- * @param {number} number Value between 0 and 999
97
- * @returns {string} Language-specific word representation
98
- */
99
- protected convertBelowThousand(number: number): string;
100
- }
101
- import AbstractLanguage from './abstract-language.js';
@@ -1,42 +0,0 @@
1
- export default TurkicLanguage;
2
- export type TurkicWordPair = {
3
- /**
4
- * - The Turkic word or phrase
5
- */
6
- word: string;
7
- /**
8
- * - The numeric value represented by the word
9
- */
10
- value: bigint;
11
- };
12
- /**
13
- * @typedef {Object} TurkicWordPair
14
- * @property {string} word - The Turkic word or phrase
15
- * @property {bigint} value - The numeric value represented by the word
16
- */
17
- /**
18
- * Base class for Turkic languages with shared grammar patterns.
19
- *
20
- * This class provides a reusable implementation for Turkic languages that share:
21
- * - Space-separated number combinations
22
- * - Implicit 'bir' (one) before hundreds and thousands
23
- * - Simple multiplication/addition logic
24
- * - Consistent magnitude handling
25
- * - Inherits decimal handling from AbstractLanguage via GreedyScaleLanguage
26
- * (supports both grouped and per-digit modes via the `convertDecimalsPerDigit` class property).
27
- *
28
- * Used by: Turkish (TR), Azerbaijani (AZ)
29
- *
30
- * Subclasses MUST define (from GreedyScaleLanguage requirements):
31
- * - `scaleWordPairs` array of [value, word] pairs as a class property (ordered descending by value).
32
- * Optionally, language-specific class properties (e.g., `negativeWord`, `zeroWord`, `decimalSeparatorWord`, `wordSeparator`).
33
- *
34
- * TurkicLanguage provides a default `mergeScales()` implementation; subclasses may override
35
- * if specialized merge logic is needed (unlikely for Turkic languages).
36
- *
37
- * @abstract
38
- * @extends GreedyScaleLanguage
39
- */
40
- declare class TurkicLanguage extends GreedyScaleLanguage {
41
- }
42
- import GreedyScaleLanguage from './greedy-scale-language.js';
@@ -1,93 +0,0 @@
1
- /**
2
- * Converts a number to Arabic cardinal (written) form.
3
- *
4
- * @param {number|string|bigint} value The number to convert.
5
- * @param {ArabicOptions} [options={}] Configuration options.
6
- * @returns {string} The number expressed in Arabic words.
7
- * @throws {TypeError} If value is NaN or invalid type.
8
- * @throws {Error} If value is an invalid number string.
9
- */
10
- export default function convertToWords(value: number | string | bigint, options?: ArabicOptions): string;
11
- /**
12
- * @typedef {Object} ArabicOptions
13
- * @property {string} [negativeWord='ناقص'] Word for negative numbers (minus).
14
- * @property {boolean} [feminine=false] Use feminine forms for numbers.
15
- */
16
- /**
17
- * Arabic language converter.
18
- *
19
- * Converts numbers to Arabic words with full grammatical support:
20
- * - Gender agreement (masculine/feminine forms)
21
- * - Complex pluralization rules (singular, dual, plural forms)
22
- * - Special handling for hundreds, thousands, millions, etc.
23
- * - Right-to-left text orientation
24
- * - Traditional Arabic number naming conventions
25
- *
26
- * Key Features:
27
- * - Gender-aware number forms (واحد masculine vs واحدة feminine)
28
- * - Dual forms: اثنان/اثنتان (two masculine/feminine)
29
- * - Complex rule system for numbers 3-10 (requiring feminine when referring to countables)
30
- * - Group-based algorithm: splits number by powers of 1000 (ones, thousands, millions, billions)
31
- * - Tanween (nunation) for indefinite numbers
32
- * - Sophisticated pluralization with singular, dual, and plural forms
33
- *
34
- * Algorithm:
35
- * 1. Break number into groups of 3 digits (right to left)
36
- * 2. For each non-zero group, convert to words using gender and plural rules
37
- * 3. Append the appropriate magnitude word (ألف/مليون/مليار) with proper plural form
38
- * 4. Join all groups with spaces
39
- *
40
- * Features:
41
- * - Support for gender-aware number forms
42
- * - Proper handling of Arabic dual forms (اثنان/اثنتان)
43
- * - Complex group processing for large numbers
44
- * - Right-to-left text orientation
45
- * - Traditional Arabic number naming conventions
46
- */
47
- export class Arabic extends AbstractLanguage {
48
- /**
49
- * Initializes the Arabic converter with language-specific options.
50
- *
51
- * @param {ArabicOptions} [options={}] Configuration options.
52
- */
53
- constructor({ negativeWord, feminine }?: ArabicOptions);
54
- arabicTens: string[];
55
- arabicHundreds: string[];
56
- arabicAppendedTwos: string[];
57
- arabicTwos: string[];
58
- arabicGroup: string[];
59
- arabicAppendedGroup: string[];
60
- arabicPluralGroups: string[];
61
- ones: {
62
- masculine: string[];
63
- feminine: string[];
64
- };
65
- feminine: boolean;
66
- selectedOnes: string[];
67
- /**
68
- * Returns the feminine status of a given digit (1-9).
69
- *
70
- * @param {number} digit - The digit to check (1-9).
71
- * @returns {string} The word form of the digit based on feminine status.
72
- */
73
- digitFeminineStatus(digit: number): string;
74
- /**
75
- * Processes the Arabic group number and returns the corresponding Arabic representation.
76
- * @param {number} groupNumber - The number to process. (Range: 1-999)
77
- * @param {number} groupLevel - Group level to process. (See example)
78
- * @returns {string} The Arabic representation of the group number.
79
- * @example 12345678 is processed in blocks of 3: '678' (group 0), '345' (group 1), '12' (group 2).
80
- */
81
- processArabicGroup(groupNumber: number, groupLevel: number, fullNumber: any): string;
82
- }
83
- export type ArabicOptions = {
84
- /**
85
- * Word for negative numbers (minus).
86
- */
87
- negativeWord?: string;
88
- /**
89
- * Use feminine forms for numbers.
90
- */
91
- feminine?: boolean;
92
- };
93
- import AbstractLanguage from '../classes/abstract-language.js';
@@ -1,25 +0,0 @@
1
- /**
2
- * Converts a number to Azerbaijani cardinal (written) form.
3
- *
4
- * @param {number|string|bigint} value The number to convert.
5
- * @param {Object} [options] Conversion options (see AZ class).
6
- * @returns {string} The number expressed in Azerbaijani words.
7
- * @throws {TypeError} If value is NaN or invalid type.
8
- * @throws {Error} If value is an invalid number string.
9
- *
10
- * @example
11
- * convertToWords(42, { lang: 'az' }); // 'qırx iki'
12
- * convertToWords(1000, { lang: 'az' }); // 'min'
13
- */
14
- export default function convertToWords(value: number | string | bigint, options?: any): string;
15
- /**
16
- * Azerbaijani language converter.
17
- *
18
- * Inherits from TurkicLanguage shared patterns:
19
- * - Space-separated number combinations
20
- * - Omits '1' before hundreds and thousands
21
- * - Supports flexible word spacing configuration
22
- */
23
- export class Azerbaijani extends TurkicLanguage {
24
- }
25
- import TurkicLanguage from '../classes/turkic-language.js';
@@ -1 +0,0 @@
1
- export default function convertToWords(value: any, options?: {}): string;
@@ -1,120 +0,0 @@
1
- /**
2
- * Converts a number to Czech cardinal (written) form.
3
- *
4
- * @param {number|string|bigint} value The number to convert.
5
- * @param {SlavicOptions} [options={}] Configuration options.
6
- * @returns {string} The number expressed in Czech words.
7
- * @throws {TypeError} If value is NaN or invalid type.
8
- * @throws {Error} If value is an invalid number string.
9
- */
10
- export default function convertToWords(value: number | string | bigint, options?: SlavicOptions): string;
11
- /**
12
- * @typedef {Object} SlavicOptions
13
- * @property {boolean} [feminine=false] Use feminine forms for numbers.
14
- */
15
- /**
16
- * Czech language converter.
17
- *
18
- * Implements Czech number words using the Slavic language pattern:
19
- * - Czech number words (jedna, dva, tři, čtyři, pět...)
20
- * - Slavic three-form pluralization (tisíc/tisíce/tisíc)
21
- * - Gender agreement for numbers 1-2
22
- * - Czech-specific number word endings
23
- *
24
- * Key Features:
25
- * - Three-form pluralization system shared across Slavic languages
26
- * * Form 1 (singular): 1 (e.g., "tisíc")
27
- * * Form 2 (few): 2-4, 22-24, 32-34... excluding teens (e.g., "tisíce")
28
- * * Form 3 (many): all other numbers (e.g., "tisíc")
29
- * - Chunk-based decomposition (splits into groups of 3 digits: ones, thousands, millions, etc.)
30
- * - Large number handling via thousands[] array with indexed [singular, few, many] forms
31
- *
32
- * Inherits from SlavicLanguage:
33
- * - Complex pluralization rules (one/few/many forms)
34
- * - Group-based large number handling (chunk decomposition via splitByX())
35
- * - Proper declension patterns via pluralize() method
36
- */
37
- export class Czech extends SlavicLanguage {
38
- ones: {
39
- 1: string;
40
- 2: string;
41
- 3: string;
42
- 4: string;
43
- 5: string;
44
- 6: string;
45
- 7: string;
46
- 8: string;
47
- 9: string;
48
- };
49
- tens: {
50
- 0: string;
51
- 1: string;
52
- 2: string;
53
- 3: string;
54
- 4: string;
55
- 5: string;
56
- 6: string;
57
- 7: string;
58
- 8: string;
59
- 9: string;
60
- };
61
- twenties: {
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
- hundreds: {
72
- 1: string;
73
- 2: string;
74
- 3: string;
75
- 4: string;
76
- 5: string;
77
- 6: string;
78
- 7: string;
79
- 8: string;
80
- 9: string;
81
- };
82
- thousands: {
83
- 1: string[];
84
- 2: string[];
85
- 3: string[];
86
- 4: string[];
87
- 5: string[];
88
- 6: string[];
89
- 7: string[];
90
- 8: string[];
91
- 9: string[];
92
- 10: string[];
93
- };
94
- /**
95
- * Returns the Czech word for the decimal separator based on the whole number.
96
- *
97
- * @returns {string} The Czech word for the decimal separator.
98
- */
99
- get decimalSeparatorWord(): string;
100
- /**
101
- * Implements Czech-specific three-form pluralization rules.
102
- *
103
- * Czech three-form system:
104
- * - Form 1 (singular): exactly n=1 (e.g., "tisíc")
105
- * - Form 2 (few): n ends in 2-4, excluding teens (22-24, 32-34...) (e.g., "tisíce")
106
- * - Form 3 (many): all other numbers (e.g., "tisíc" for 0, 5+)
107
- *
108
- * @param {bigint} n The number to classify.
109
- * @param {Array<string>} forms Array of [singular, few, many] word forms.
110
- * @returns {string} The appropriate form for the number n.
111
- */
112
- pluralize(n: bigint, forms: Array<string>): string;
113
- }
114
- export type SlavicOptions = {
115
- /**
116
- * Use feminine forms for numbers.
117
- */
118
- feminine?: boolean;
119
- };
120
- import SlavicLanguage from '../classes/slavic-language.js';
@@ -1,53 +0,0 @@
1
- /**
2
- * Converts a number to Danish cardinal (written) form.
3
- *
4
- * @param {number|string|bigint} value The number to convert.
5
- * @param {Object} [options] Conversion options (see Danish class options).
6
- * @param {boolean} [options.ordFlag=false] Enable ordinal number conversion.
7
- * @returns {string} The number expressed in Danish words.
8
- * @throws {TypeError} If value is NaN or invalid type.
9
- * @throws {Error} If value is an invalid number string.
10
- *
11
- * @example
12
- * convertToWords(25); // 'femogtyve' (five-and-twenty)
13
- * convertToWords(50); // 'halvtreds' (half-third-times-twenty)
14
- */
15
- export default function convertToWords(value: number | string | bigint, options?: {
16
- ordFlag?: boolean;
17
- }): string;
18
- /**
19
- * @typedef {Object} DanishOptions
20
- * @property {boolean} [ordFlag=false] Enable ordinal number conversion.
21
- */
22
- /**
23
- * Danish language converter.
24
- *
25
- * GreedyScaleLanguage with Danish-specific extensions:
26
- * - Unique vigesimal (base-20) number system for 50-90
27
- * - Special composition rules ("og" for "and" between units and tens)
28
- * - Reverse digit order (e.g., "fem-og-tyve" = five-and-twenty = 25)
29
- * - Support for ordinal numbers via ordFlag option
30
- *
31
- * Key Features:
32
- * - Vigesimal tens: halvtreds (50), treds (60), halvfjerds (70), firs (80), halvfems (90)
33
- * - Units-before-tens pattern (e.g., "tre-og-tyve" = 23)
34
- * - "et" prefix for hundreds/thousands (not "en")
35
- * - Optional ordinal number conversion via ordFlag option
36
- * - Inline merge logic tailored for Danish ordering
37
- */
38
- export class Danish extends GreedyScaleLanguage {
39
- /**
40
- * Initializes the Danish converter with language-specific options.
41
- *
42
- * @param {DanishOptions} [options={}] Configuration options.
43
- */
44
- constructor({ ordFlag }?: DanishOptions);
45
- ordFlag: boolean;
46
- }
47
- export type DanishOptions = {
48
- /**
49
- * Enable ordinal number conversion.
50
- */
51
- ordFlag?: boolean;
52
- };
53
- import GreedyScaleLanguage from '../classes/greedy-scale-language.js';
@@ -1,26 +0,0 @@
1
- /**
2
- * Converts a number to German cardinal (written) form.
3
- *
4
- * @param {number|string|bigint} value The number to convert.
5
- * @param {Object} [options] Conversion options (see German class options).
6
- * @returns {string} The number expressed in German words.
7
- * @throws {TypeError} If value is NaN or invalid type.
8
- * @throws {Error} If value is an invalid number string.
9
- *
10
- * @example
11
- * convertToWords(42); // 'zweiundvierzig'
12
- * convertToWords('1.5'); // 'eins komma fünf'
13
- */
14
- export default function convertToWords(value: number | string | bigint, options?: any): string;
15
- /**
16
- * German language converter.
17
- *
18
- * Handles German grammatical features:
19
- * - "eins" vs "ein" and "eine" forms for 1
20
- * - Compound words without separators (e.g., "einundzwanzig" = 21)
21
- * - Million/Billion pluralization
22
- * - Special characters (e.g., "ü", "ö", "ß")
23
- */
24
- export class German extends GreedyScaleLanguage {
25
- }
26
- import GreedyScaleLanguage from '../classes/greedy-scale-language.js';
@@ -1,11 +0,0 @@
1
- /**
2
- * Converts a number to its word representation in Greek.
3
- * @param {number|string|bigint} value - The number to convert
4
- * @param {Object} [options={}] - Conversion options
5
- * @returns {string} The word representation of the number
6
- * @example
7
- * convertToWords(42) // 'σαράντα δύο'
8
- * convertToWords(1000) // 'χίλια'
9
- * convertToWords(2000) // 'δύο χίλια'
10
- */
11
- export default function convertToWords(value: number | string | bigint, options?: any): string;
@@ -1,30 +0,0 @@
1
- /**
2
- * Converts a number to English cardinal (written) form.
3
- *
4
- * @param {number|string|bigint} value The number to convert.
5
- * @param {Object} [options] Conversion options (see English class options).
6
- * @returns {string} The number expressed in English words.
7
- * @throws {TypeError} If value is NaN or invalid type.
8
- * @throws {Error} If value is an invalid number string.
9
- *
10
- * @example
11
- * convertToWords(42); // 'forty-two'
12
- * convertToWords('1.5'); // 'one point five'
13
- */
14
- export default function convertToWords(value: number | string | bigint, options?: any): string;
15
- /**
16
- * English language converter.
17
- *
18
- * Converts numbers to English words, supporting:
19
- * - Negative numbers (prepended with "minus")
20
- * - Decimal numbers (word "point" between whole and fractional parts)
21
- * - Numbers up to octillions
22
- *
23
- * Merge rules:
24
- * - Hyphenated for compound tens (e.g., "twenty-three")
25
- * - "and" after hundreds (e.g., "one hundred and one")
26
- * - Space-separated for larger composites (e.g., "one thousand twenty-three")
27
- */
28
- export class English extends GreedyScaleLanguage {
29
- }
30
- import GreedyScaleLanguage from '../classes/greedy-scale-language.js';