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/gu.js
CHANGED
|
@@ -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
|
-
*
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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,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 }
|
package/lib/languages/hbo.d.ts
CHANGED
|
@@ -1,113 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Biblical Hebrew
|
|
2
|
+
* Converts a numeric value to Biblical Hebrew words.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
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
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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;
|