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.
- package/CHANGELOG.md +64 -0
- package/README.md +86 -188
- package/dist/languages/am-Latn.js +3 -0
- package/dist/languages/am-Latn.js.map +1 -0
- package/dist/languages/am.js +3 -0
- package/dist/languages/am.js.map +1 -0
- package/dist/languages/ar.js +3 -0
- package/dist/languages/ar.js.map +1 -0
- package/dist/languages/az.js +3 -0
- package/dist/languages/az.js.map +1 -0
- package/dist/languages/bn.js +3 -0
- package/dist/languages/bn.js.map +1 -0
- package/dist/languages/cs.js +3 -0
- package/dist/languages/cs.js.map +1 -0
- package/dist/languages/da.js +3 -0
- package/dist/languages/da.js.map +1 -0
- package/dist/languages/de.js +3 -0
- package/dist/languages/de.js.map +1 -0
- package/dist/languages/el.js +3 -0
- package/dist/languages/el.js.map +1 -0
- package/dist/languages/en.js +3 -0
- package/dist/languages/en.js.map +1 -0
- package/dist/languages/es.js +3 -0
- package/dist/languages/es.js.map +1 -0
- package/dist/languages/fa.js +3 -0
- package/dist/languages/fa.js.map +1 -0
- package/dist/languages/fi.js +3 -0
- package/dist/languages/fi.js.map +1 -0
- package/dist/languages/fil.js +3 -0
- package/dist/languages/fil.js.map +1 -0
- package/dist/languages/fr-BE.js +3 -0
- package/dist/languages/fr-BE.js.map +1 -0
- package/dist/languages/fr.js +3 -0
- package/dist/languages/fr.js.map +1 -0
- package/dist/languages/gu.js +3 -0
- package/dist/languages/gu.js.map +1 -0
- package/dist/languages/ha.js +3 -0
- package/dist/languages/ha.js.map +1 -0
- package/dist/languages/hbo.js +3 -0
- package/dist/languages/hbo.js.map +1 -0
- package/dist/languages/he.js +3 -0
- package/dist/languages/he.js.map +1 -0
- package/dist/languages/hi.js +3 -0
- package/dist/languages/hi.js.map +1 -0
- package/dist/languages/hr.js +3 -0
- package/dist/languages/hr.js.map +1 -0
- package/dist/languages/hu.js +3 -0
- package/dist/languages/hu.js.map +1 -0
- package/dist/languages/id.js +3 -0
- package/dist/languages/id.js.map +1 -0
- package/dist/languages/it.js +3 -0
- package/dist/languages/it.js.map +1 -0
- package/dist/languages/ja.js +3 -0
- package/dist/languages/ja.js.map +1 -0
- package/dist/languages/ka.js +3 -0
- package/dist/languages/ka.js.map +1 -0
- package/dist/languages/kn.js +3 -0
- package/dist/languages/kn.js.map +1 -0
- package/dist/languages/ko.js +3 -0
- package/dist/languages/ko.js.map +1 -0
- package/dist/languages/lt.js +3 -0
- package/dist/languages/lt.js.map +1 -0
- package/dist/languages/lv.js +3 -0
- package/dist/languages/lv.js.map +1 -0
- package/dist/languages/mr.js +3 -0
- package/dist/languages/mr.js.map +1 -0
- package/dist/languages/ms.js +3 -0
- package/dist/languages/ms.js.map +1 -0
- package/dist/languages/nb.js +3 -0
- package/dist/languages/nb.js.map +1 -0
- package/dist/languages/nl.js +3 -0
- package/dist/languages/nl.js.map +1 -0
- package/dist/languages/pa.js +3 -0
- package/dist/languages/pa.js.map +1 -0
- package/dist/languages/pl.js +3 -0
- package/dist/languages/pl.js.map +1 -0
- package/dist/languages/pt.js +3 -0
- package/dist/languages/pt.js.map +1 -0
- package/dist/languages/ro.js +3 -0
- package/dist/languages/ro.js.map +1 -0
- package/dist/languages/ru.js +3 -0
- package/dist/languages/ru.js.map +1 -0
- package/dist/languages/sr-Cyrl.js +3 -0
- package/dist/languages/sr-Cyrl.js.map +1 -0
- package/dist/languages/sr-Latn.js +3 -0
- package/dist/languages/sr-Latn.js.map +1 -0
- package/dist/languages/sv.js +3 -0
- package/dist/languages/sv.js.map +1 -0
- package/dist/languages/sw.js +3 -0
- package/dist/languages/sw.js.map +1 -0
- package/dist/languages/ta.js +3 -0
- package/dist/languages/ta.js.map +1 -0
- package/dist/languages/te.js +3 -0
- package/dist/languages/te.js.map +1 -0
- package/dist/languages/th.js +3 -0
- package/dist/languages/th.js.map +1 -0
- package/dist/languages/tr.js +3 -0
- package/dist/languages/tr.js.map +1 -0
- package/dist/languages/uk.js +3 -0
- package/dist/languages/uk.js.map +1 -0
- package/dist/languages/ur.js +3 -0
- package/dist/languages/ur.js.map +1 -0
- package/dist/languages/vi.js +3 -0
- package/dist/languages/vi.js.map +1 -0
- package/dist/languages/yo.js +3 -0
- package/dist/languages/yo.js.map +1 -0
- package/dist/languages/zh-Hans.js +3 -0
- package/dist/languages/zh-Hans.js.map +1 -0
- package/dist/languages/zh-Hant.js +3 -0
- package/dist/languages/zh-Hant.js.map +1 -0
- package/dist/n2words.js +2 -2
- package/dist/n2words.js.map +1 -1
- package/lib/languages/am-Latn.d.ts +7 -0
- package/lib/languages/am-Latn.js +159 -0
- package/lib/languages/am.d.ts +7 -0
- package/lib/languages/am.js +159 -0
- package/lib/languages/ar.d.ts +14 -27
- package/lib/languages/ar.js +175 -129
- package/lib/languages/az.d.ts +4 -9
- package/lib/languages/az.js +166 -37
- package/lib/languages/bn.d.ts +4 -8
- package/lib/languages/bn.js +159 -124
- package/lib/languages/cs.d.ts +15 -85
- package/lib/languages/cs.js +293 -114
- package/lib/languages/da.d.ts +11 -12
- package/lib/languages/da.js +269 -101
- package/lib/languages/de.d.ts +14 -11
- package/lib/languages/de.js +305 -86
- package/lib/languages/el.d.ts +11 -11
- package/lib/languages/el.js +224 -78
- package/lib/languages/en.d.ts +14 -13
- package/lib/languages/en.js +228 -72
- package/lib/languages/es.d.ts +18 -12
- package/lib/languages/es.js +297 -103
- package/lib/languages/fa.d.ts +4 -44
- package/lib/languages/fa.js +112 -122
- package/lib/languages/fi.d.ts +14 -0
- package/lib/languages/fi.js +238 -0
- package/lib/languages/fil.d.ts +4 -13
- package/lib/languages/fil.js +196 -106
- package/lib/languages/fr-BE.d.ts +8 -8
- package/lib/languages/fr-BE.js +285 -19
- package/lib/languages/fr.d.ts +18 -12
- package/lib/languages/fr.js +339 -89
- package/lib/languages/gu.d.ts +4 -8
- package/lib/languages/gu.js +143 -125
- package/lib/languages/ha.d.ts +7 -0
- package/lib/languages/ha.js +225 -0
- package/lib/languages/hbo.d.ts +10 -110
- package/lib/languages/hbo.js +245 -214
- package/lib/languages/he.d.ts +10 -77
- package/lib/languages/he.js +231 -172
- package/lib/languages/hi.d.ts +4 -8
- package/lib/languages/hi.js +163 -124
- package/lib/languages/hr.d.ts +8 -77
- package/lib/languages/hr.js +200 -89
- package/lib/languages/hu.d.ts +4 -19
- package/lib/languages/hu.js +198 -119
- package/lib/languages/id.d.ts +4 -34
- package/lib/languages/id.js +166 -129
- package/lib/languages/it.d.ts +16 -34
- package/lib/languages/it.js +307 -97
- package/lib/languages/ja.d.ts +14 -14
- package/lib/languages/ja.js +221 -111
- package/lib/languages/ka.d.ts +17 -0
- package/lib/languages/ka.js +291 -0
- package/lib/languages/kn.d.ts +4 -8
- package/lib/languages/kn.js +143 -35
- package/lib/languages/ko.d.ts +11 -11
- package/lib/languages/ko.js +250 -49
- package/lib/languages/lt.d.ts +15 -67
- package/lib/languages/lt.js +287 -122
- package/lib/languages/lv.d.ts +15 -67
- package/lib/languages/lv.js +288 -106
- package/lib/languages/mr.d.ts +4 -8
- package/lib/languages/mr.js +143 -125
- package/lib/languages/ms.d.ts +4 -28
- package/lib/languages/ms.js +166 -116
- package/lib/languages/nb.d.ts +11 -9
- package/lib/languages/nb.js +272 -87
- package/lib/languages/nl.d.ts +23 -13
- package/lib/languages/nl.js +299 -133
- package/lib/languages/pa.d.ts +4 -8
- package/lib/languages/pa.js +151 -124
- package/lib/languages/pl.d.ts +19 -77
- package/lib/languages/pl.js +294 -87
- package/lib/languages/pt.d.ts +14 -26
- package/lib/languages/pt.js +272 -92
- package/lib/languages/ro.d.ts +15 -155
- package/lib/languages/ro.js +219 -235
- package/lib/languages/ru.d.ts +8 -82
- package/lib/languages/ru.js +239 -90
- package/lib/languages/sr-Cyrl.d.ts +8 -77
- package/lib/languages/sr-Cyrl.js +197 -89
- package/lib/languages/sr-Latn.d.ts +8 -77
- package/lib/languages/sr-Latn.js +197 -89
- package/lib/languages/sv.d.ts +11 -11
- package/lib/languages/sv.js +278 -74
- package/lib/languages/sw.d.ts +4 -36
- package/lib/languages/sw.js +133 -106
- package/lib/languages/ta.d.ts +4 -17
- package/lib/languages/ta.js +143 -202
- package/lib/languages/te.d.ts +4 -19
- package/lib/languages/te.js +133 -196
- package/lib/languages/th.d.ts +4 -14
- package/lib/languages/th.js +135 -91
- package/lib/languages/tr.d.ts +15 -9
- package/lib/languages/tr.js +245 -49
- package/lib/languages/uk.d.ts +8 -82
- package/lib/languages/uk.js +206 -78
- package/lib/languages/ur.d.ts +4 -8
- package/lib/languages/ur.js +151 -124
- package/lib/languages/vi.d.ts +14 -69
- package/lib/languages/vi.js +278 -129
- package/lib/languages/yo.d.ts +7 -0
- package/lib/languages/yo.js +303 -0
- package/lib/languages/zh-Hans.d.ts +8 -18
- package/lib/languages/zh-Hans.js +163 -92
- package/lib/languages/zh-Hant.d.ts +8 -18
- package/lib/languages/zh-Hant.js +181 -90
- package/lib/n2words.d.ts +55 -209
- package/lib/n2words.js +115 -530
- package/lib/utils/is-plain-object.d.ts +13 -0
- package/lib/utils/is-plain-object.js +17 -0
- package/lib/utils/parse-numeric.d.ts +17 -0
- package/lib/utils/parse-numeric.js +108 -0
- package/lib/utils/validate-options.d.ts +8 -0
- package/lib/utils/validate-options.js +16 -0
- package/package.json +26 -14
- package/dist/ArabicConverter.js +0 -3
- package/dist/ArabicConverter.js.map +0 -1
- package/dist/AzerbaijaniConverter.js +0 -3
- package/dist/AzerbaijaniConverter.js.map +0 -1
- package/dist/BanglaConverter.js +0 -3
- package/dist/BanglaConverter.js.map +0 -1
- package/dist/BiblicalHebrewConverter.js +0 -3
- package/dist/BiblicalHebrewConverter.js.map +0 -1
- package/dist/CroatianConverter.js +0 -3
- package/dist/CroatianConverter.js.map +0 -1
- package/dist/CzechConverter.js +0 -3
- package/dist/CzechConverter.js.map +0 -1
- package/dist/DanishConverter.js +0 -3
- package/dist/DanishConverter.js.map +0 -1
- package/dist/DutchConverter.js +0 -3
- package/dist/DutchConverter.js.map +0 -1
- package/dist/EnglishConverter.js +0 -3
- package/dist/EnglishConverter.js.map +0 -1
- package/dist/FilipinoConverter.js +0 -3
- package/dist/FilipinoConverter.js.map +0 -1
- package/dist/FrenchBelgiumConverter.js +0 -3
- package/dist/FrenchBelgiumConverter.js.map +0 -1
- package/dist/FrenchConverter.js +0 -3
- package/dist/FrenchConverter.js.map +0 -1
- package/dist/GermanConverter.js +0 -3
- package/dist/GermanConverter.js.map +0 -1
- package/dist/GreekConverter.js +0 -3
- package/dist/GreekConverter.js.map +0 -1
- package/dist/GujaratiConverter.js +0 -3
- package/dist/GujaratiConverter.js.map +0 -1
- package/dist/HebrewConverter.js +0 -3
- package/dist/HebrewConverter.js.map +0 -1
- package/dist/HindiConverter.js +0 -3
- package/dist/HindiConverter.js.map +0 -1
- package/dist/HungarianConverter.js +0 -3
- package/dist/HungarianConverter.js.map +0 -1
- package/dist/IndonesianConverter.js +0 -3
- package/dist/IndonesianConverter.js.map +0 -1
- package/dist/ItalianConverter.js +0 -3
- package/dist/ItalianConverter.js.map +0 -1
- package/dist/JapaneseConverter.js +0 -3
- package/dist/JapaneseConverter.js.map +0 -1
- package/dist/KannadaConverter.js +0 -3
- package/dist/KannadaConverter.js.map +0 -1
- package/dist/KoreanConverter.js +0 -3
- package/dist/KoreanConverter.js.map +0 -1
- package/dist/LatvianConverter.js +0 -3
- package/dist/LatvianConverter.js.map +0 -1
- package/dist/LithuanianConverter.js +0 -3
- package/dist/LithuanianConverter.js.map +0 -1
- package/dist/MalayConverter.js +0 -3
- package/dist/MalayConverter.js.map +0 -1
- package/dist/MarathiConverter.js +0 -3
- package/dist/MarathiConverter.js.map +0 -1
- package/dist/NorwegianBokmalConverter.js +0 -3
- package/dist/NorwegianBokmalConverter.js.map +0 -1
- package/dist/PersianConverter.js +0 -3
- package/dist/PersianConverter.js.map +0 -1
- package/dist/PolishConverter.js +0 -3
- package/dist/PolishConverter.js.map +0 -1
- package/dist/PortugueseConverter.js +0 -3
- package/dist/PortugueseConverter.js.map +0 -1
- package/dist/PunjabiConverter.js +0 -3
- package/dist/PunjabiConverter.js.map +0 -1
- package/dist/RomanianConverter.js +0 -3
- package/dist/RomanianConverter.js.map +0 -1
- package/dist/RussianConverter.js +0 -3
- package/dist/RussianConverter.js.map +0 -1
- package/dist/SerbianCyrillicConverter.js +0 -3
- package/dist/SerbianCyrillicConverter.js.map +0 -1
- package/dist/SerbianLatinConverter.js +0 -3
- package/dist/SerbianLatinConverter.js.map +0 -1
- package/dist/SimplifiedChineseConverter.js +0 -3
- package/dist/SimplifiedChineseConverter.js.map +0 -1
- package/dist/SpanishConverter.js +0 -3
- package/dist/SpanishConverter.js.map +0 -1
- package/dist/SwahiliConverter.js +0 -3
- package/dist/SwahiliConverter.js.map +0 -1
- package/dist/SwedishConverter.js +0 -3
- package/dist/SwedishConverter.js.map +0 -1
- package/dist/TamilConverter.js +0 -3
- package/dist/TamilConverter.js.map +0 -1
- package/dist/TeluguConverter.js +0 -3
- package/dist/TeluguConverter.js.map +0 -1
- package/dist/ThaiConverter.js +0 -3
- package/dist/ThaiConverter.js.map +0 -1
- package/dist/TraditionalChineseConverter.js +0 -3
- package/dist/TraditionalChineseConverter.js.map +0 -1
- package/dist/TurkishConverter.js +0 -3
- package/dist/TurkishConverter.js.map +0 -1
- package/dist/UkrainianConverter.js +0 -3
- package/dist/UkrainianConverter.js.map +0 -1
- package/dist/UrduConverter.js +0 -3
- package/dist/UrduConverter.js.map +0 -1
- package/dist/VietnameseConverter.js +0 -3
- package/dist/VietnameseConverter.js.map +0 -1
- package/lib/classes/abstract-language.d.ts +0 -178
- package/lib/classes/abstract-language.js +0 -268
- package/lib/classes/greedy-scale-language.d.ts +0 -109
- package/lib/classes/greedy-scale-language.js +0 -201
- package/lib/classes/slavic-language.d.ts +0 -148
- package/lib/classes/slavic-language.js +0 -281
- package/lib/classes/south-asian-language.d.ts +0 -70
- package/lib/classes/south-asian-language.js +0 -154
- package/lib/classes/turkic-language.d.ts +0 -26
- package/lib/classes/turkic-language.js +0 -59
package/lib/languages/hbo.js
CHANGED
|
@@ -1,251 +1,282 @@
|
|
|
1
|
-
import { SlavicLanguage } from '../classes/slavic-language.js'
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
|
-
* Biblical Hebrew language converter
|
|
2
|
+
* Biblical Hebrew language converter - Functional Implementation
|
|
3
|
+
*
|
|
4
|
+
* Self-contained module with its own input validation, ready for subpath exports.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
* -
|
|
8
|
-
* -
|
|
9
|
-
* -
|
|
6
|
+
* Key features:
|
|
7
|
+
* - Gender agreement (masculine default, feminine via option)
|
|
8
|
+
* - Dual forms for 2, 200, 2000
|
|
9
|
+
* - Special 1-9 thousands construct state
|
|
10
|
+
* - "ו" (ve) conjunction rules vary by position
|
|
11
|
+
* - Per-digit decimal reading
|
|
10
12
|
*/
|
|
11
|
-
export class BiblicalHebrew extends SlavicLanguage {
|
|
12
|
-
negativeWord = 'מינוס'
|
|
13
|
-
decimalSeparatorWord = 'נקודה'
|
|
14
|
-
zeroWord = 'אפס'
|
|
15
|
-
usePerDigitDecimals = true
|
|
16
|
-
|
|
17
|
-
// Biblical Hebrew (masculine forms as default - historically accurate)
|
|
18
|
-
onesWords = {
|
|
19
|
-
1: 'אחד',
|
|
20
|
-
2: 'שניים',
|
|
21
|
-
3: 'שלשה',
|
|
22
|
-
4: 'ארבעה',
|
|
23
|
-
5: 'חמשה',
|
|
24
|
-
6: 'ששה',
|
|
25
|
-
7: 'שבעה',
|
|
26
|
-
8: 'שמונה',
|
|
27
|
-
9: 'תשעה'
|
|
28
|
-
}
|
|
29
13
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
1: 'אחד עשר',
|
|
33
|
-
2: 'שנים עשר',
|
|
34
|
-
3: 'שלשה עשר',
|
|
35
|
-
4: 'ארבעה עשר',
|
|
36
|
-
5: 'חמשה עשר',
|
|
37
|
-
6: 'ששה עשר',
|
|
38
|
-
7: 'שבעה עשר',
|
|
39
|
-
8: 'שמונה עשר',
|
|
40
|
-
9: 'תשעה עשר'
|
|
41
|
-
}
|
|
14
|
+
import { parseNumericValue } from '../utils/parse-numeric.js'
|
|
15
|
+
import { validateOptions } from '../utils/validate-options.js'
|
|
42
16
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
4: 'ארבעים',
|
|
47
|
-
5: 'חמישים',
|
|
48
|
-
6: 'ששים',
|
|
49
|
-
7: 'שבעים',
|
|
50
|
-
8: 'שמונים',
|
|
51
|
-
9: 'תשעים'
|
|
52
|
-
}
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Vocabulary (arrays for indexed access - faster than object property lookup)
|
|
19
|
+
// ============================================================================
|
|
53
20
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}
|
|
21
|
+
// Masculine forms (default in Biblical Hebrew) - index 0 unused
|
|
22
|
+
const ONES_MASC = ['', 'אחד', 'שניים', 'שלשה', 'ארבעה', 'חמשה', 'ששה', 'שבעה', 'שמונה', 'תשעה']
|
|
23
|
+
const TEENS_MASC = ['עשרה', 'אחד עשר', 'שנים עשר', 'שלשה עשר', 'ארבעה עשר', 'חמשה עשר', 'ששה עשר', 'שבעה עשר', 'שמונה עשר', 'תשעה עשר']
|
|
24
|
+
const THOUSANDS_MASC = ['', 'אלף', 'אלפיים', 'שלשה אלפים', 'ארבעה אלפים', 'חמשה אלפים', 'ששה אלפים', 'שבעה אלפים', 'שמונה אלפים', 'תשעה אלפים']
|
|
59
25
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
4: 'ארבעה אלפים',
|
|
65
|
-
5: 'חמשה אלפים',
|
|
66
|
-
6: 'ששה אלפים',
|
|
67
|
-
7: 'שבעה אלפים',
|
|
68
|
-
8: 'שמונה אלפים',
|
|
69
|
-
9: 'תשעה אלפים'
|
|
70
|
-
}
|
|
26
|
+
// Feminine forms - index 0 unused
|
|
27
|
+
const ONES_FEM = ['', 'אחת', 'שתים', 'שלש', 'ארבע', 'חמש', 'שש', 'שבע', 'שמונה', 'תשע']
|
|
28
|
+
const TEENS_FEM = ['עשר', 'אחת עשרה', 'שתים עשרה', 'שלש עשרה', 'ארבע עשרה', 'חמש עשרה', 'שש עשרה', 'שבע עשרה', 'שמונה עשרה', 'תשע עשרה']
|
|
29
|
+
const THOUSANDS_FEM = ['', 'אלף', 'אלפיים', 'שלשת אלפים', 'ארבעת אלפים', 'חמשת אלפים', 'ששת אלפים', 'שבעת אלפים', 'שמונת אלפים', 'תשעת אלפים']
|
|
71
30
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
3: 'שלשת אלפים',
|
|
77
|
-
4: 'ארבעת אלפים',
|
|
78
|
-
5: 'חמשת אלפים',
|
|
79
|
-
6: 'ששת אלפים',
|
|
80
|
-
7: 'שבעת אלפים',
|
|
81
|
-
8: 'שמונת אלפים',
|
|
82
|
-
9: 'תשעת אלפים'
|
|
83
|
-
}
|
|
31
|
+
// Shared vocabulary
|
|
32
|
+
const TENS = ['', '', 'עשרים', 'שלשים', 'ארבעים', 'חמישים', 'ששים', 'שבעים', 'שמונים', 'תשעים']
|
|
33
|
+
const HUNDREDS = ['', 'מאה', 'מאתיים', 'שלשה מאות', 'ארבעה מאות', 'חמשה מאות', 'ששה מאות', 'שבעה מאות', 'שמונה מאות', 'תשעה מאות']
|
|
34
|
+
const HUNDREDS_FEM = ['', 'מאה', 'מאתיים', 'שלש מאות', 'ארבע מאות', 'חמש מאות', 'שש מאות', 'שבע מאות', 'שמונה מאות', 'תשע מאות']
|
|
84
35
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
3: 'מיליארד', // billion
|
|
89
|
-
4: 'טריליון', // trillion
|
|
90
|
-
5: 'קוודרליון', // quadrillion
|
|
91
|
-
6: 'קווינטיליון' // quintillion
|
|
92
|
-
}
|
|
36
|
+
// Scale words (index 1 = thousands, 2 = millions, etc.)
|
|
37
|
+
const SCALE = ['', 'אלף', 'מיליון', 'מיליארד', 'טריליון', 'קוודרליון', 'קווינטיליון']
|
|
38
|
+
const SCALE_PLURAL = ['', 'אלפים', 'מיליונים', 'מיליארדים', 'טריליונים', 'קוודרליונים', 'קווינטיליונים']
|
|
93
39
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
40
|
+
const ZERO = 'אפס'
|
|
41
|
+
const NEGATIVE = 'מינוס'
|
|
42
|
+
const DECIMAL_SEP = 'נקודה'
|
|
43
|
+
|
|
44
|
+
// ============================================================================
|
|
45
|
+
// Segment Building
|
|
46
|
+
// ============================================================================
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Builds segment word for scale segments (thousands, millions, etc.).
|
|
50
|
+
* "ו" is added before tens and ones when following hundreds.
|
|
51
|
+
*/
|
|
52
|
+
function buildScaleSegment (n, andWord, ONES, TEENS, HUNDREDS_ARR) {
|
|
53
|
+
if (n === 0) return ''
|
|
102
54
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
8: 'שמונה',
|
|
113
|
-
9: 'תשע'
|
|
55
|
+
const ones = n % 10
|
|
56
|
+
const tens = Math.floor(n / 10) % 10
|
|
57
|
+
const hundreds = Math.floor(n / 100)
|
|
58
|
+
|
|
59
|
+
let result = ''
|
|
60
|
+
|
|
61
|
+
// Hundreds
|
|
62
|
+
if (hundreds > 0) {
|
|
63
|
+
result = HUNDREDS_ARR[hundreds]
|
|
114
64
|
}
|
|
115
65
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
66
|
+
// Tens and ones
|
|
67
|
+
if (tens === 1) {
|
|
68
|
+
// Teens (10-19)
|
|
69
|
+
const teenWord = TEENS[ones]
|
|
70
|
+
if (result) {
|
|
71
|
+
result += ' ' + andWord + teenWord
|
|
72
|
+
} else {
|
|
73
|
+
result = teenWord
|
|
74
|
+
}
|
|
75
|
+
} else {
|
|
76
|
+
// Tens (20-90)
|
|
77
|
+
if (tens >= 2) {
|
|
78
|
+
if (result) {
|
|
79
|
+
result += ' ' + andWord + TENS[tens]
|
|
80
|
+
} else {
|
|
81
|
+
result = TENS[tens]
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Ones
|
|
86
|
+
if (ones > 0) {
|
|
87
|
+
if (result) {
|
|
88
|
+
result += ' ' + andWord + ONES[ones]
|
|
89
|
+
} else {
|
|
90
|
+
result = ONES[ones]
|
|
91
|
+
}
|
|
92
|
+
}
|
|
127
93
|
}
|
|
128
94
|
|
|
129
|
-
|
|
130
|
-
|
|
95
|
+
return result
|
|
96
|
+
}
|
|
131
97
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
98
|
+
/**
|
|
99
|
+
* Builds segment word for units segment (no scale word).
|
|
100
|
+
* "ו" is only added before the final ones digit.
|
|
101
|
+
*/
|
|
102
|
+
function buildUnitsSegment (n, andWord, ONES, TEENS, HUNDREDS_ARR) {
|
|
103
|
+
if (n === 0) return ''
|
|
136
104
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
105
|
+
const ones = n % 10
|
|
106
|
+
const tens = Math.floor(n / 10) % 10
|
|
107
|
+
const hundreds = Math.floor(n / 100)
|
|
108
|
+
|
|
109
|
+
let result = ''
|
|
110
|
+
|
|
111
|
+
// Hundreds
|
|
112
|
+
if (hundreds > 0) {
|
|
113
|
+
result = HUNDREDS_ARR[hundreds]
|
|
142
114
|
}
|
|
143
115
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
116
|
+
// Tens (no conjunction)
|
|
117
|
+
if (tens === 1) {
|
|
118
|
+
// Teens (10-19)
|
|
119
|
+
if (result) {
|
|
120
|
+
result += ' ' + TEENS[ones]
|
|
121
|
+
} else {
|
|
122
|
+
result = TEENS[ones]
|
|
148
123
|
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
continue
|
|
124
|
+
} else {
|
|
125
|
+
if (tens >= 2) {
|
|
126
|
+
if (result) {
|
|
127
|
+
result += ' ' + TENS[tens]
|
|
128
|
+
} else {
|
|
129
|
+
result = TENS[tens]
|
|
156
130
|
}
|
|
131
|
+
}
|
|
157
132
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
if (
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
hasHundreds = true
|
|
168
|
-
if (n3 <= 2n) {
|
|
169
|
-
chunkWords.push(this.hundredsWords[n3])
|
|
170
|
-
} else {
|
|
171
|
-
chunkWords.push(this.onesWords[n3] + ' ' + this.hundredsWords[3])
|
|
172
|
-
}
|
|
173
|
-
}
|
|
133
|
+
// Ones - conjunction only here
|
|
134
|
+
if (ones > 0) {
|
|
135
|
+
if (result) {
|
|
136
|
+
result += ' ' + andWord + ONES[ones]
|
|
137
|
+
} else {
|
|
138
|
+
result = ONES[ones]
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
174
142
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
// Add conjunction if there were hundreds before
|
|
178
|
-
const tensWord = this.twentiesWords[n2]
|
|
179
|
-
chunkWords.push(hasHundreds ? this.options.andWord + tensWord : tensWord)
|
|
180
|
-
}
|
|
143
|
+
return result
|
|
144
|
+
}
|
|
181
145
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
const onesWord = this.teensWords[n1]
|
|
186
|
-
chunkWords.push(hasHundreds ? this.options.andWord + onesWord : onesWord)
|
|
187
|
-
} else if (n1 > 0n) {
|
|
188
|
-
// For "one million", "one billion", etc., don't add the word "one"
|
|
189
|
-
if (x === 1n && index > 1) {
|
|
190
|
-
// Skip adding "one" for millions/billions/etc.
|
|
191
|
-
} else if (x <= 9n && chunkWords.length === 0 && index === 1) {
|
|
192
|
-
// Use special forms for 1-9 thousand
|
|
193
|
-
chunkWords.push(this.pluralForms[n1])
|
|
194
|
-
} else {
|
|
195
|
-
const onesWord = this.onesWords[n1]
|
|
196
|
-
// Add conjunction if there were hundreds or tens before
|
|
197
|
-
chunkWords.push((hasHundreds || n2 > 0n) ? this.options.andWord + onesWord : onesWord)
|
|
198
|
-
}
|
|
199
|
-
}
|
|
146
|
+
// ============================================================================
|
|
147
|
+
// Conversion Functions
|
|
148
|
+
// ============================================================================
|
|
200
149
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
} else if (x === 2n) {
|
|
211
|
-
// For two million, two billion, etc. - use plural form
|
|
212
|
-
chunkWords.push(this.scalePlural[index])
|
|
213
|
-
} else if (index === 1) {
|
|
214
|
-
// For thousands (10+), always use singular "אלף"
|
|
215
|
-
chunkWords.push(this.scale[index])
|
|
216
|
-
} else {
|
|
217
|
-
// For millions/billions/etc. use plural form
|
|
218
|
-
chunkWords.push(this.scalePlural[index])
|
|
219
|
-
}
|
|
220
|
-
}
|
|
150
|
+
/**
|
|
151
|
+
* Converts a non-negative integer to Biblical Hebrew words.
|
|
152
|
+
*
|
|
153
|
+
* @param {bigint} n - Non-negative integer to convert
|
|
154
|
+
* @param {Object} options - Conversion options
|
|
155
|
+
* @returns {string} Biblical Hebrew words
|
|
156
|
+
*/
|
|
157
|
+
function integerToWords (n, options) {
|
|
158
|
+
if (n === 0n) return ZERO
|
|
221
159
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
160
|
+
const andWord = options.andWord ?? 'ו'
|
|
161
|
+
const gender = options.gender || 'masculine'
|
|
162
|
+
const isFeminine = gender === 'feminine'
|
|
163
|
+
|
|
164
|
+
// Select vocabulary based on gender
|
|
165
|
+
const ONES = isFeminine ? ONES_FEM : ONES_MASC
|
|
166
|
+
const TEENS = isFeminine ? TEENS_FEM : TEENS_MASC
|
|
167
|
+
const THOUSANDS_SPECIAL = isFeminine ? THOUSANDS_FEM : THOUSANDS_MASC
|
|
168
|
+
const HUNDREDS_ARR = isFeminine ? HUNDREDS_FEM : HUNDREDS
|
|
169
|
+
|
|
170
|
+
// Fast path: numbers < 1000
|
|
171
|
+
if (n < 1000n) {
|
|
172
|
+
return buildUnitsSegment(Number(n), andWord, ONES, TEENS, HUNDREDS_ARR)
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Extract segments using BigInt modulo
|
|
176
|
+
const segments = []
|
|
177
|
+
let temp = n
|
|
178
|
+
while (temp > 0n) {
|
|
179
|
+
segments.push(Number(temp % 1000n))
|
|
180
|
+
temp = temp / 1000n
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Build result string directly
|
|
184
|
+
let result = ''
|
|
185
|
+
|
|
186
|
+
for (let i = segments.length - 1; i >= 0; i--) {
|
|
187
|
+
const segment = segments[i]
|
|
188
|
+
if (segment === 0) continue
|
|
225
189
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
190
|
+
if (i === 0) {
|
|
191
|
+
// Units segment (no scale word)
|
|
192
|
+
const segmentWord = buildUnitsSegment(segment, andWord, ONES, TEENS, HUNDREDS_ARR)
|
|
193
|
+
if (result) {
|
|
194
|
+
// Add "ו" before single-digit units when following scale words
|
|
195
|
+
if (segment <= 9) {
|
|
196
|
+
result += ' ' + andWord + segmentWord
|
|
229
197
|
} else {
|
|
230
|
-
|
|
198
|
+
result += ' ' + segmentWord
|
|
231
199
|
}
|
|
200
|
+
} else {
|
|
201
|
+
result = segmentWord
|
|
232
202
|
}
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
203
|
+
} else if (i === 1) {
|
|
204
|
+
// Thousands - special handling for 1-9
|
|
205
|
+
if (segment <= 9) {
|
|
206
|
+
if (result) result += ' '
|
|
207
|
+
result += THOUSANDS_SPECIAL[segment]
|
|
208
|
+
} else {
|
|
209
|
+
const segmentWord = buildScaleSegment(segment, andWord, ONES, TEENS, HUNDREDS_ARR)
|
|
210
|
+
if (result) result += ' '
|
|
211
|
+
result += segmentWord + ' ' + SCALE[1]
|
|
236
212
|
}
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
213
|
+
} else {
|
|
214
|
+
// Millions and above
|
|
215
|
+
if (segment === 1) {
|
|
216
|
+
if (result) result += ' '
|
|
217
|
+
result += SCALE[i]
|
|
218
|
+
} else {
|
|
219
|
+
const segmentWord = buildScaleSegment(segment, andWord, ONES, TEENS, HUNDREDS_ARR)
|
|
220
|
+
if (result) result += ' '
|
|
221
|
+
result += segmentWord + ' ' + SCALE_PLURAL[i]
|
|
242
222
|
}
|
|
243
223
|
}
|
|
224
|
+
}
|
|
244
225
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
226
|
+
return result
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Converts decimal digits to Biblical Hebrew words (digit by digit).
|
|
231
|
+
*
|
|
232
|
+
* @param {string} decimalPart - Decimal digits (without the point)
|
|
233
|
+
* @param {Object} options - Conversion options
|
|
234
|
+
* @returns {string} Biblical Hebrew words for decimal part
|
|
235
|
+
*/
|
|
236
|
+
function decimalPartToWords (decimalPart, options) {
|
|
237
|
+
const gender = options.gender || 'masculine'
|
|
238
|
+
const ONES = gender === 'feminine' ? ONES_FEM : ONES_MASC
|
|
239
|
+
|
|
240
|
+
let result = ''
|
|
241
|
+
for (let i = 0; i < decimalPart.length; i++) {
|
|
242
|
+
const d = parseInt(decimalPart[i], 10)
|
|
243
|
+
if (result) result += ' '
|
|
244
|
+
result += d === 0 ? ZERO : ONES[d]
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
return result
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Converts a numeric value to Biblical Hebrew words.
|
|
252
|
+
*
|
|
253
|
+
* @param {number | string | bigint} value - The numeric value to convert
|
|
254
|
+
* @param {Object} [options] - Optional configuration
|
|
255
|
+
* @param {('masculine'|'feminine')} [options.gender='masculine'] - Grammatical gender
|
|
256
|
+
* @param {string} [options.andWord] - Custom conjunction word
|
|
257
|
+
* @returns {string} The number in Biblical Hebrew words
|
|
258
|
+
*/
|
|
259
|
+
function toWords (value, options) {
|
|
260
|
+
options = validateOptions(options)
|
|
261
|
+
const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
|
|
262
|
+
|
|
263
|
+
let result = ''
|
|
248
264
|
|
|
249
|
-
|
|
265
|
+
if (isNegative) {
|
|
266
|
+
result = NEGATIVE + ' '
|
|
250
267
|
}
|
|
268
|
+
|
|
269
|
+
result += integerToWords(integerPart, options)
|
|
270
|
+
|
|
271
|
+
if (decimalPart) {
|
|
272
|
+
result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart, options)
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
return result
|
|
251
276
|
}
|
|
277
|
+
|
|
278
|
+
// ============================================================================
|
|
279
|
+
// Exports
|
|
280
|
+
// ============================================================================
|
|
281
|
+
|
|
282
|
+
export { toWords }
|
package/lib/languages/he.d.ts
CHANGED
|
@@ -1,80 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Modern Hebrew
|
|
2
|
+
* Converts a numeric value to Modern Hebrew words.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
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 Modern Hebrew words
|
|
9
9
|
*/
|
|
10
|
-
export
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
2: string;
|
|
15
|
-
3: string;
|
|
16
|
-
4: string;
|
|
17
|
-
5: string;
|
|
18
|
-
6: string;
|
|
19
|
-
7: string;
|
|
20
|
-
8: string;
|
|
21
|
-
9: string;
|
|
22
|
-
};
|
|
23
|
-
teensWords: {
|
|
24
|
-
0: string;
|
|
25
|
-
1: string;
|
|
26
|
-
2: string;
|
|
27
|
-
3: string;
|
|
28
|
-
4: string;
|
|
29
|
-
5: string;
|
|
30
|
-
6: string;
|
|
31
|
-
7: string;
|
|
32
|
-
8: string;
|
|
33
|
-
9: string;
|
|
34
|
-
};
|
|
35
|
-
twentiesWords: {
|
|
36
|
-
2: string;
|
|
37
|
-
3: string;
|
|
38
|
-
4: string;
|
|
39
|
-
5: string;
|
|
40
|
-
6: string;
|
|
41
|
-
7: string;
|
|
42
|
-
8: string;
|
|
43
|
-
9: string;
|
|
44
|
-
};
|
|
45
|
-
hundredsWords: {
|
|
46
|
-
1: string;
|
|
47
|
-
2: string;
|
|
48
|
-
3: string;
|
|
49
|
-
};
|
|
50
|
-
pluralForms: {
|
|
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
|
-
scale: {
|
|
62
|
-
1: string;
|
|
63
|
-
2: string;
|
|
64
|
-
3: string;
|
|
65
|
-
4: string;
|
|
66
|
-
5: string;
|
|
67
|
-
6: string;
|
|
68
|
-
};
|
|
69
|
-
scalePlural: {
|
|
70
|
-
1: string;
|
|
71
|
-
2: string;
|
|
72
|
-
3: string;
|
|
73
|
-
4: string;
|
|
74
|
-
5: string;
|
|
75
|
-
6: string;
|
|
76
|
-
};
|
|
77
|
-
/** Converts integer part to Hebrew words with special handling for thousands. */
|
|
78
|
-
integerToWords(integerPart: any): string;
|
|
79
|
-
}
|
|
80
|
-
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;
|