n2words 1.24.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +285 -156
- package/dist/ArabicConverter.js +3 -0
- package/dist/ArabicConverter.js.map +1 -0
- package/dist/AzerbaijaniConverter.js +3 -0
- package/dist/AzerbaijaniConverter.js.map +1 -0
- package/dist/BanglaConverter.js +3 -0
- package/dist/BanglaConverter.js.map +1 -0
- package/dist/BiblicalHebrewConverter.js +3 -0
- package/dist/BiblicalHebrewConverter.js.map +1 -0
- package/dist/CroatianConverter.js +3 -0
- package/dist/CroatianConverter.js.map +1 -0
- package/dist/CzechConverter.js +3 -0
- package/dist/CzechConverter.js.map +1 -0
- package/dist/DanishConverter.js +3 -0
- package/dist/DanishConverter.js.map +1 -0
- package/dist/DutchConverter.js +3 -0
- package/dist/DutchConverter.js.map +1 -0
- package/dist/EnglishConverter.js +3 -0
- package/dist/EnglishConverter.js.map +1 -0
- package/dist/FilipinoConverter.js +3 -0
- package/dist/FilipinoConverter.js.map +1 -0
- package/dist/FrenchBelgiumConverter.js +3 -0
- package/dist/FrenchBelgiumConverter.js.map +1 -0
- package/dist/FrenchConverter.js +3 -0
- package/dist/FrenchConverter.js.map +1 -0
- package/dist/GermanConverter.js +3 -0
- package/dist/GermanConverter.js.map +1 -0
- package/dist/GreekConverter.js +3 -0
- package/dist/GreekConverter.js.map +1 -0
- package/dist/GujaratiConverter.js +3 -0
- package/dist/GujaratiConverter.js.map +1 -0
- package/dist/HebrewConverter.js +3 -0
- package/dist/HebrewConverter.js.map +1 -0
- package/dist/HindiConverter.js +3 -0
- package/dist/HindiConverter.js.map +1 -0
- package/dist/HungarianConverter.js +3 -0
- package/dist/HungarianConverter.js.map +1 -0
- package/dist/IndonesianConverter.js +3 -0
- package/dist/IndonesianConverter.js.map +1 -0
- package/dist/ItalianConverter.js +3 -0
- package/dist/ItalianConverter.js.map +1 -0
- package/dist/JapaneseConverter.js +3 -0
- package/dist/JapaneseConverter.js.map +1 -0
- package/dist/KannadaConverter.js +3 -0
- package/dist/KannadaConverter.js.map +1 -0
- package/dist/KoreanConverter.js +3 -0
- package/dist/KoreanConverter.js.map +1 -0
- package/dist/LatvianConverter.js +3 -0
- package/dist/LatvianConverter.js.map +1 -0
- package/dist/LithuanianConverter.js +3 -0
- package/dist/LithuanianConverter.js.map +1 -0
- package/dist/MalayConverter.js +3 -0
- package/dist/MalayConverter.js.map +1 -0
- package/dist/MarathiConverter.js +3 -0
- package/dist/MarathiConverter.js.map +1 -0
- package/dist/NorwegianBokmalConverter.js +3 -0
- package/dist/NorwegianBokmalConverter.js.map +1 -0
- package/dist/PersianConverter.js +3 -0
- package/dist/PersianConverter.js.map +1 -0
- package/dist/PolishConverter.js +3 -0
- package/dist/PolishConverter.js.map +1 -0
- package/dist/PortugueseConverter.js +3 -0
- package/dist/PortugueseConverter.js.map +1 -0
- package/dist/PunjabiConverter.js +3 -0
- package/dist/PunjabiConverter.js.map +1 -0
- package/dist/RomanianConverter.js +3 -0
- package/dist/RomanianConverter.js.map +1 -0
- package/dist/RussianConverter.js +3 -0
- package/dist/RussianConverter.js.map +1 -0
- package/dist/SerbianCyrillicConverter.js +3 -0
- package/dist/SerbianCyrillicConverter.js.map +1 -0
- package/dist/SerbianLatinConverter.js +3 -0
- package/dist/SerbianLatinConverter.js.map +1 -0
- package/dist/SimplifiedChineseConverter.js +3 -0
- package/dist/SimplifiedChineseConverter.js.map +1 -0
- package/dist/SpanishConverter.js +3 -0
- package/dist/SpanishConverter.js.map +1 -0
- package/dist/SwahiliConverter.js +3 -0
- package/dist/SwahiliConverter.js.map +1 -0
- package/dist/SwedishConverter.js +3 -0
- package/dist/SwedishConverter.js.map +1 -0
- package/dist/TamilConverter.js +3 -0
- package/dist/TamilConverter.js.map +1 -0
- package/dist/TeluguConverter.js +3 -0
- package/dist/TeluguConverter.js.map +1 -0
- package/dist/ThaiConverter.js +3 -0
- package/dist/ThaiConverter.js.map +1 -0
- package/dist/TraditionalChineseConverter.js +3 -0
- package/dist/TraditionalChineseConverter.js.map +1 -0
- package/dist/TurkishConverter.js +3 -0
- package/dist/TurkishConverter.js.map +1 -0
- package/dist/UkrainianConverter.js +3 -0
- package/dist/UkrainianConverter.js.map +1 -0
- package/dist/UrduConverter.js +3 -0
- package/dist/UrduConverter.js.map +1 -0
- package/dist/VietnameseConverter.js +3 -0
- package/dist/VietnameseConverter.js.map +1 -0
- package/dist/n2words.js +3 -2
- package/dist/n2words.js.map +1 -1
- package/lib/classes/abstract-language.d.ts +178 -0
- package/lib/classes/abstract-language.js +192 -185
- package/lib/classes/greedy-scale-language.d.ts +109 -0
- package/lib/classes/greedy-scale-language.js +96 -90
- package/lib/classes/slavic-language.d.ts +148 -0
- package/lib/classes/slavic-language.js +136 -106
- package/lib/classes/south-asian-language.d.ts +70 -0
- package/lib/classes/south-asian-language.js +58 -65
- package/lib/classes/turkic-language.d.ts +26 -0
- package/lib/classes/turkic-language.js +22 -26
- package/lib/languages/ar.d.ts +30 -0
- package/lib/languages/ar.js +49 -133
- package/lib/languages/az.d.ts +12 -0
- package/lib/languages/az.js +7 -23
- package/lib/languages/bn.d.ts +11 -0
- package/lib/languages/bn.js +12 -7
- package/lib/languages/cs.d.ts +88 -0
- package/lib/languages/cs.js +44 -113
- package/lib/languages/da.d.ts +15 -0
- package/lib/languages/da.js +40 -87
- package/lib/languages/de.d.ts +14 -0
- package/lib/languages/de.js +34 -68
- package/lib/languages/el.d.ts +14 -0
- package/lib/languages/el.js +22 -48
- package/lib/languages/en.d.ts +16 -0
- package/lib/languages/en.js +22 -59
- package/lib/languages/es.d.ts +15 -0
- package/lib/languages/es.js +49 -81
- package/lib/languages/fa.d.ts +47 -0
- package/lib/languages/fa.js +90 -73
- package/lib/languages/fil.d.ts +16 -0
- package/lib/languages/fil.js +35 -76
- package/lib/languages/fr-BE.d.ts +11 -0
- package/lib/languages/fr-BE.js +15 -51
- package/lib/languages/fr.d.ts +15 -0
- package/lib/languages/fr.js +33 -72
- package/lib/languages/gu.d.ts +11 -0
- package/lib/languages/gu.js +10 -34
- package/lib/languages/hbo.d.ts +113 -0
- package/lib/languages/hbo.js +251 -0
- package/lib/languages/he.d.ts +80 -0
- package/lib/languages/he.js +41 -164
- package/lib/languages/hi.d.ts +11 -0
- package/lib/languages/hi.js +12 -7
- package/lib/languages/hr.d.ts +80 -0
- package/lib/languages/hr.js +51 -95
- package/lib/languages/hu.d.ts +22 -0
- package/lib/languages/hu.js +35 -53
- package/lib/languages/id.d.ts +37 -0
- package/lib/languages/id.js +29 -44
- package/lib/languages/it.d.ts +37 -0
- package/lib/languages/it.js +36 -52
- package/lib/languages/ja.d.ts +17 -0
- package/lib/languages/ja.js +22 -75
- package/lib/languages/kn.d.ts +11 -0
- package/lib/languages/kn.js +10 -39
- package/lib/languages/ko.d.ts +14 -0
- package/lib/languages/ko.js +17 -45
- package/lib/languages/lt.d.ts +70 -0
- package/lib/languages/lt.js +28 -63
- package/lib/languages/lv.d.ts +70 -0
- package/lib/languages/lv.js +35 -58
- package/lib/languages/mr.d.ts +11 -0
- package/lib/languages/mr.js +10 -34
- package/lib/languages/ms.d.ts +31 -0
- package/lib/languages/ms.js +24 -20
- package/lib/languages/nb.d.ts +12 -0
- package/lib/languages/nb.js +36 -56
- package/lib/languages/nl.d.ts +16 -0
- package/lib/languages/nl.js +58 -109
- package/lib/languages/pa.d.ts +11 -0
- package/lib/languages/{pa-Guru.js → pa.js} +12 -7
- package/lib/languages/pl.d.ts +80 -0
- package/lib/languages/pl.js +26 -105
- package/lib/languages/pt.d.ts +29 -0
- package/lib/languages/pt.js +29 -64
- package/lib/languages/ro.d.ts +158 -0
- package/lib/languages/ro.js +60 -167
- package/lib/languages/ru.d.ts +85 -0
- package/lib/languages/ru.js +17 -37
- package/lib/languages/sr-Cyrl.d.ts +80 -0
- package/lib/languages/sr-Cyrl.js +113 -0
- package/lib/languages/sr-Latn.d.ts +80 -0
- package/lib/languages/sr-Latn.js +54 -98
- package/lib/languages/sv.d.ts +14 -0
- package/lib/languages/sv.js +26 -63
- package/lib/languages/sw.d.ts +39 -0
- package/lib/languages/sw.js +26 -21
- package/lib/languages/ta.d.ts +20 -0
- package/lib/languages/ta.js +26 -26
- package/lib/languages/te.d.ts +22 -0
- package/lib/languages/te.js +28 -38
- package/lib/languages/th.d.ts +17 -0
- package/lib/languages/th.js +25 -31
- package/lib/languages/tr.d.ts +12 -0
- package/lib/languages/tr.js +11 -38
- package/lib/languages/uk.d.ts +85 -0
- package/lib/languages/uk.js +18 -44
- package/lib/languages/ur.d.ts +11 -0
- package/lib/languages/ur.js +12 -7
- package/lib/languages/vi.d.ts +72 -0
- package/lib/languages/vi.js +25 -71
- package/lib/languages/zh-Hans.d.ts +21 -0
- package/lib/languages/zh-Hans.js +33 -87
- package/lib/languages/zh-Hant.d.ts +21 -0
- package/lib/languages/zh-Hant.js +111 -0
- package/lib/n2words.d.ts +209 -0
- package/lib/n2words.js +474 -191
- package/package.json +106 -67
- package/dist/languages/ar.js +0 -2
- package/dist/languages/ar.js.map +0 -1
- package/dist/languages/az.js +0 -2
- package/dist/languages/az.js.map +0 -1
- package/dist/languages/bn.js +0 -2
- package/dist/languages/bn.js.map +0 -1
- package/dist/languages/cs.js +0 -2
- package/dist/languages/cs.js.map +0 -1
- package/dist/languages/da.js +0 -2
- package/dist/languages/da.js.map +0 -1
- package/dist/languages/de.js +0 -2
- package/dist/languages/de.js.map +0 -1
- package/dist/languages/el.js +0 -2
- package/dist/languages/el.js.map +0 -1
- package/dist/languages/en.js +0 -2
- package/dist/languages/en.js.map +0 -1
- package/dist/languages/es.js +0 -2
- package/dist/languages/es.js.map +0 -1
- package/dist/languages/fa.js +0 -2
- package/dist/languages/fa.js.map +0 -1
- package/dist/languages/fil.js +0 -2
- package/dist/languages/fil.js.map +0 -1
- package/dist/languages/fr-BE.js +0 -2
- package/dist/languages/fr-BE.js.map +0 -1
- package/dist/languages/fr.js +0 -2
- package/dist/languages/fr.js.map +0 -1
- package/dist/languages/gu.js +0 -2
- package/dist/languages/gu.js.map +0 -1
- package/dist/languages/he.js +0 -2
- package/dist/languages/he.js.map +0 -1
- package/dist/languages/hi.js +0 -2
- package/dist/languages/hi.js.map +0 -1
- package/dist/languages/hr.js +0 -2
- package/dist/languages/hr.js.map +0 -1
- package/dist/languages/hu.js +0 -2
- package/dist/languages/hu.js.map +0 -1
- package/dist/languages/id.js +0 -2
- package/dist/languages/id.js.map +0 -1
- package/dist/languages/it.js +0 -2
- package/dist/languages/it.js.map +0 -1
- package/dist/languages/ja.js +0 -2
- package/dist/languages/ja.js.map +0 -1
- package/dist/languages/kn.js +0 -2
- package/dist/languages/kn.js.map +0 -1
- package/dist/languages/ko.js +0 -2
- package/dist/languages/ko.js.map +0 -1
- package/dist/languages/lt.js +0 -2
- package/dist/languages/lt.js.map +0 -1
- package/dist/languages/lv.js +0 -2
- package/dist/languages/lv.js.map +0 -1
- package/dist/languages/mr.js +0 -2
- package/dist/languages/mr.js.map +0 -1
- package/dist/languages/ms.js +0 -2
- package/dist/languages/ms.js.map +0 -1
- package/dist/languages/nb.js +0 -2
- package/dist/languages/nb.js.map +0 -1
- package/dist/languages/nl.js +0 -2
- package/dist/languages/nl.js.map +0 -1
- package/dist/languages/pa-Guru.js +0 -2
- package/dist/languages/pa-Guru.js.map +0 -1
- package/dist/languages/pl.js +0 -2
- package/dist/languages/pl.js.map +0 -1
- package/dist/languages/pt.js +0 -2
- package/dist/languages/pt.js.map +0 -1
- package/dist/languages/ro.js +0 -2
- package/dist/languages/ro.js.map +0 -1
- package/dist/languages/ru.js +0 -2
- package/dist/languages/ru.js.map +0 -1
- package/dist/languages/sr-Latn.js +0 -2
- package/dist/languages/sr-Latn.js.map +0 -1
- package/dist/languages/sv.js +0 -2
- package/dist/languages/sv.js.map +0 -1
- package/dist/languages/sw.js +0 -2
- package/dist/languages/sw.js.map +0 -1
- package/dist/languages/ta.js +0 -2
- package/dist/languages/ta.js.map +0 -1
- package/dist/languages/te.js +0 -2
- package/dist/languages/te.js.map +0 -1
- package/dist/languages/th.js +0 -2
- package/dist/languages/th.js.map +0 -1
- package/dist/languages/tr.js +0 -2
- package/dist/languages/tr.js.map +0 -1
- package/dist/languages/uk.js +0 -2
- package/dist/languages/uk.js.map +0 -1
- package/dist/languages/ur.js +0 -2
- package/dist/languages/ur.js.map +0 -1
- package/dist/languages/vi.js +0 -2
- package/dist/languages/vi.js.map +0 -1
- package/dist/languages/zh-Hans.js +0 -2
- package/dist/languages/zh-Hans.js.map +0 -1
- package/typings/classes/abstract-language.d.ts +0 -144
- package/typings/classes/greedy-scale-language.d.ts +0 -148
- package/typings/classes/slavic-language.d.ts +0 -145
- package/typings/classes/south-asian-language.d.ts +0 -101
- package/typings/classes/turkic-language.d.ts +0 -42
- package/typings/languages/ar.d.ts +0 -93
- package/typings/languages/az.d.ts +0 -25
- package/typings/languages/bn.d.ts +0 -1
- package/typings/languages/cs.d.ts +0 -120
- package/typings/languages/da.d.ts +0 -53
- package/typings/languages/de.d.ts +0 -26
- package/typings/languages/el.d.ts +0 -11
- package/typings/languages/en.d.ts +0 -30
- package/typings/languages/es.d.ts +0 -43
- package/typings/languages/fa.d.ts +0 -81
- package/typings/languages/fil.d.ts +0 -12
- package/typings/languages/fr-BE.d.ts +0 -41
- package/typings/languages/fr.d.ts +0 -43
- package/typings/languages/gu.d.ts +0 -12
- package/typings/languages/he.d.ts +0 -197
- package/typings/languages/hi.d.ts +0 -1
- package/typings/languages/hr.d.ts +0 -110
- package/typings/languages/hu.d.ts +0 -37
- package/typings/languages/id.d.ts +0 -69
- package/typings/languages/it.d.ts +0 -51
- package/typings/languages/ja.d.ts +0 -58
- package/typings/languages/kn.d.ts +0 -11
- package/typings/languages/ko.d.ts +0 -25
- package/typings/languages/lt.d.ts +0 -110
- package/typings/languages/lv.d.ts +0 -99
- package/typings/languages/mr.d.ts +0 -12
- package/typings/languages/ms.d.ts +0 -37
- package/typings/languages/nb.d.ts +0 -27
- package/typings/languages/nl.d.ts +0 -65
- package/typings/languages/pa-Guru.d.ts +0 -1
- package/typings/languages/pl.d.ts +0 -116
- package/typings/languages/pt.d.ts +0 -39
- package/typings/languages/ro.d.ts +0 -229
- package/typings/languages/ru.d.ts +0 -108
- package/typings/languages/sr-Latn.d.ts +0 -98
- package/typings/languages/sv.d.ts +0 -30
- package/typings/languages/sw.d.ts +0 -1
- package/typings/languages/ta.d.ts +0 -1
- package/typings/languages/te.d.ts +0 -1
- package/typings/languages/th.d.ts +0 -1
- package/typings/languages/tr.d.ts +0 -46
- package/typings/languages/uk.d.ts +0 -117
- package/typings/languages/ur.d.ts +0 -1
- package/typings/languages/vi.d.ts +0 -116
- package/typings/languages/zh-Hans.d.ts +0 -57
- package/typings/n2words.d.ts +0 -177
package/lib/languages/nl.js
CHANGED
|
@@ -1,25 +1,19 @@
|
|
|
1
|
-
import GreedyScaleLanguage from '../classes/greedy-scale-language.js'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @typedef {Object} DutchOptions
|
|
5
|
-
* @property {boolean} [includeOptionalAnd=false] Include optional "en" separator.
|
|
6
|
-
* @property {boolean} [noHundredPairs=false] Disable comma before hundreds.
|
|
7
|
-
* @property {boolean} [accentOne=true] Use accented "één" for one.
|
|
8
|
-
*/
|
|
1
|
+
import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'
|
|
9
2
|
|
|
10
3
|
/**
|
|
11
4
|
* Dutch language converter.
|
|
12
5
|
*
|
|
13
|
-
*
|
|
14
|
-
* - Optional "en" (and) separator for tens
|
|
15
|
-
* - Optional comma before hundreds
|
|
6
|
+
* Supports:
|
|
7
|
+
* - Optional "en" (and) separator for tens
|
|
8
|
+
* - Optional comma before hundreds
|
|
16
9
|
* - Compound word formation without hyphenation
|
|
17
10
|
*/
|
|
18
11
|
export class Dutch extends GreedyScaleLanguage {
|
|
19
12
|
negativeWord = 'min'
|
|
20
13
|
decimalSeparatorWord = 'komma'
|
|
21
14
|
zeroWord = 'nul'
|
|
22
|
-
|
|
15
|
+
|
|
16
|
+
scaleWords = [
|
|
23
17
|
[1_000_000_000_000_000_000_000_000_000n, 'quadriljard'],
|
|
24
18
|
[1_000_000_000_000_000_000_000_000n, 'quadriljoen'],
|
|
25
19
|
[1_000_000_000_000_000_000_000n, 'triljard'],
|
|
@@ -60,147 +54,102 @@ export class Dutch extends GreedyScaleLanguage {
|
|
|
60
54
|
[0n, 'nul']
|
|
61
55
|
]
|
|
62
56
|
|
|
63
|
-
|
|
64
|
-
* Initializes the Dutch converter with language-specific options.
|
|
65
|
-
*
|
|
66
|
-
* @param {DutchOptions} [options={}] Configuration options.
|
|
67
|
-
*/
|
|
68
|
-
constructor ({ includeOptionalAnd = false, noHundredPairs = false, accentOne = true } = {}) {
|
|
57
|
+
constructor (options = {}) {
|
|
69
58
|
super()
|
|
70
59
|
|
|
71
|
-
this.
|
|
72
|
-
|
|
73
|
-
|
|
60
|
+
this.setOptions({
|
|
61
|
+
includeOptionalAnd: false,
|
|
62
|
+
noHundredPairing: false,
|
|
63
|
+
accentOne: true
|
|
64
|
+
}, options)
|
|
74
65
|
|
|
75
|
-
this.accentOne
|
|
76
|
-
|
|
77
|
-
this.scaleWordPairs[this.scaleWordPairs.length - 2][1] = 'een'
|
|
66
|
+
if (!this.options.accentOne) {
|
|
67
|
+
this.scaleWords[this.scaleWords.length - 2][1] = 'een'
|
|
78
68
|
}
|
|
79
69
|
}
|
|
80
70
|
|
|
81
|
-
/**
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
* - Optional "en" separator based on includeOptionalAnd option
|
|
88
|
-
* - Compound words without separators for most combinations
|
|
89
|
-
* - Converts 'één' to 'een' in compound words (no accent in compounds)
|
|
90
|
-
* - Space separators for large numbers (millions+)
|
|
91
|
-
*
|
|
92
|
-
* @param {Object} current The left operand as `{ word: BigInt }`.
|
|
93
|
-
* @param {Object} next The right operand as `{ word: BigInt }`.
|
|
94
|
-
* @returns {Object} Merged pair with combined word and resulting numeric value.
|
|
95
|
-
*
|
|
96
|
-
* @example
|
|
97
|
-
* mergeScales({ 'één': 1n }, { 'duizend': 1000n }); // { 'duizend': 1000n }
|
|
98
|
-
* mergeScales({ 'twintig': 20n }, { 'drie': 3n }); // { 'drieentwintig': 23n }
|
|
99
|
-
*/
|
|
100
|
-
mergeScales (current, next) {
|
|
101
|
-
let cText = Object.keys(current)[0]
|
|
102
|
-
let nText = Object.keys(next)[0]
|
|
103
|
-
const cNumber = Object.values(current)[0] // BigInt
|
|
104
|
-
const nNumber = Object.values(next)[0] // BigInt
|
|
71
|
+
/** Combines two word-sets according to Dutch grammar rules. */
|
|
72
|
+
combineWordSets (preceding, following) {
|
|
73
|
+
let precedingWord = Object.keys(preceding)[0]
|
|
74
|
+
let followingWord = Object.keys(following)[0]
|
|
75
|
+
const precedingValue = Object.values(preceding)[0] // BigInt
|
|
76
|
+
const followingValue = Object.values(following)[0] // BigInt
|
|
105
77
|
|
|
106
78
|
// Implicit "een": omit before large multipliers ("miljoen" not "een miljoen")
|
|
107
|
-
if (
|
|
108
|
-
if (
|
|
109
|
-
return
|
|
79
|
+
if (precedingValue === 1n) {
|
|
80
|
+
if (followingValue < 1_000_000n) {
|
|
81
|
+
return following
|
|
110
82
|
}
|
|
111
|
-
|
|
83
|
+
precedingWord = this.options.accentOne ? 'één' : 'een'
|
|
112
84
|
}
|
|
113
85
|
|
|
114
86
|
// Handle multiplication and spacing
|
|
115
|
-
if (
|
|
87
|
+
if (followingValue > precedingValue) {
|
|
116
88
|
let hadSpace = false
|
|
117
89
|
// Large scale words (millions+): add space before multiplier
|
|
118
|
-
if (
|
|
119
|
-
|
|
90
|
+
if (followingValue >= 1_000_000n) {
|
|
91
|
+
precedingWord += ' '
|
|
120
92
|
hadSpace = true
|
|
121
|
-
} else if (
|
|
93
|
+
} else if (followingValue > 100n) {
|
|
122
94
|
// Hundreds and above: add space after multiplier
|
|
123
|
-
|
|
95
|
+
followingWord += ' '
|
|
124
96
|
hadSpace = true
|
|
125
97
|
}
|
|
126
98
|
// Convert 'één' to 'een' in compounds (when no space or accentOne disabled)
|
|
127
|
-
if (!hadSpace || !this.accentOne) {
|
|
128
|
-
|
|
129
|
-
|
|
99
|
+
if (!hadSpace || !this.options.accentOne) {
|
|
100
|
+
precedingWord = precedingWord.replace(/één/g, 'een')
|
|
101
|
+
followingWord = followingWord.replace(/één/g, 'een')
|
|
130
102
|
}
|
|
131
|
-
return { [`${
|
|
103
|
+
return { [`${precedingWord}${followingWord}`]: precedingValue * followingValue }
|
|
132
104
|
}
|
|
133
105
|
|
|
134
106
|
// Track if we're adding a space (which keeps words separate)
|
|
135
107
|
let hasSpace = false
|
|
136
108
|
|
|
137
|
-
if (
|
|
138
|
-
const temporary =
|
|
139
|
-
|
|
109
|
+
if (followingValue < 10n && precedingValue > 10n && precedingValue < 100n) {
|
|
110
|
+
const temporary = followingWord
|
|
111
|
+
followingWord = precedingWord
|
|
140
112
|
const andTxt = temporary.endsWith('e') ? 'ën' : 'en'
|
|
141
|
-
|
|
142
|
-
} else if (
|
|
143
|
-
|
|
144
|
-
} else if (
|
|
145
|
-
|
|
113
|
+
precedingWord = `${temporary}${andTxt}`
|
|
114
|
+
} else if (followingValue < 13n && precedingValue < 1000n && this.options.includeOptionalAnd) {
|
|
115
|
+
precedingWord = `${precedingWord}en`
|
|
116
|
+
} else if (followingValue < 13n && precedingValue >= 1000n && this.options.includeOptionalAnd) {
|
|
117
|
+
followingWord = ` en ${followingWord}`
|
|
146
118
|
hasSpace = true
|
|
147
|
-
} else if (
|
|
148
|
-
|
|
119
|
+
} else if (precedingValue >= 1_000_000n) {
|
|
120
|
+
precedingWord += ' '
|
|
149
121
|
hasSpace = true
|
|
150
|
-
} else if (
|
|
151
|
-
|
|
122
|
+
} else if (precedingValue === 1000n) {
|
|
123
|
+
precedingWord += ' '
|
|
152
124
|
hasSpace = true
|
|
153
125
|
}
|
|
154
126
|
|
|
155
127
|
// Convert 'één' to 'een' in direct compounds (no space)
|
|
156
128
|
// Keep 'één' only if there's a space AND accentOne=true
|
|
157
129
|
if (!hasSpace) {
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
} else if (!this.accentOne) {
|
|
161
|
-
|
|
162
|
-
|
|
130
|
+
precedingWord = precedingWord.replace(/één/g, 'een')
|
|
131
|
+
followingWord = followingWord.replace(/één/g, 'een')
|
|
132
|
+
} else if (!this.options.accentOne) {
|
|
133
|
+
precedingWord = precedingWord.replace(/één/g, 'een')
|
|
134
|
+
followingWord = followingWord.replace(/één/g, 'een')
|
|
163
135
|
}
|
|
164
136
|
|
|
165
|
-
return { [`${
|
|
137
|
+
return { [`${precedingWord}${followingWord}`]: precedingValue + followingValue }
|
|
166
138
|
}
|
|
167
139
|
|
|
168
|
-
|
|
169
|
-
if (
|
|
170
|
-
const high =
|
|
171
|
-
const low =
|
|
140
|
+
integerToWords (integerPart) {
|
|
141
|
+
if (integerPart >= 1100n && integerPart < 10_000n && !this.options.noHundredPairing) {
|
|
142
|
+
const high = integerPart / 100n
|
|
143
|
+
const low = integerPart % 100n
|
|
172
144
|
if (high % 10n !== 0n) {
|
|
173
|
-
let result = super.
|
|
145
|
+
let result = super.integerToWords(high) + 'honderd'
|
|
174
146
|
if (low) {
|
|
175
147
|
result +=
|
|
176
|
-
(this.includeOptionalAnd ? ' en ' : ' ') + super.
|
|
148
|
+
(this.options.includeOptionalAnd ? ' en ' : ' ') + super.integerToWords(low)
|
|
177
149
|
}
|
|
178
150
|
return result
|
|
179
151
|
}
|
|
180
152
|
}
|
|
181
|
-
return super.
|
|
153
|
+
return super.integerToWords(integerPart)
|
|
182
154
|
}
|
|
183
155
|
}
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* Converts a number to Dutch cardinal (written) form.
|
|
187
|
-
*
|
|
188
|
-
* @param {number|string|bigint} value The number to convert.
|
|
189
|
-
* @param {Object} [options] Conversion options (see Dutch class options).
|
|
190
|
-
* @param {boolean} [options.includeOptionalAnd=false] Include optional 'en' (and) separator.
|
|
191
|
-
* @param {boolean} [options.noHundredPairs=false] Don't combine hundreds with tens/units.
|
|
192
|
-
* @param {boolean} [options.accentOne=true] Use accented 'één' for standalone 1.
|
|
193
|
-
* @returns {string} The number expressed in Dutch words.
|
|
194
|
-
* @throws {TypeError} If value is NaN or invalid type.
|
|
195
|
-
* @throws {Error} If value is an invalid number string.
|
|
196
|
-
*
|
|
197
|
-
* @example
|
|
198
|
-
* convertToWords(1); // 'één' (default accent)
|
|
199
|
-
* convertToWords(1, { accentOne: false }); // 'een'
|
|
200
|
-
* convertToWords(21); // 'eenentwintig' (no accent in compounds)
|
|
201
|
-
* convertToWords(42); // 'tweeenveertig'
|
|
202
|
-
* convertToWords('1.5'); // 'één komma vijf'
|
|
203
|
-
*/
|
|
204
|
-
export default function convertToWords (value, options = {}) {
|
|
205
|
-
return new Dutch(options).convertToWords(value)
|
|
206
|
-
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Punjabi language converter.
|
|
3
|
+
*
|
|
4
|
+
* Supports:
|
|
5
|
+
* - Indian numbering system (ਹਜ਼ਾਰ, ਲੱਖ, ਕਰੋੜ)
|
|
6
|
+
* - Gurmukhi script
|
|
7
|
+
* - Complete word forms for 0-99
|
|
8
|
+
*/
|
|
9
|
+
export class Punjabi extends SouthAsianLanguage {
|
|
10
|
+
}
|
|
11
|
+
import { SouthAsianLanguage } from '../classes/south-asian-language.js';
|
|
@@ -1,11 +1,20 @@
|
|
|
1
|
-
import SouthAsianLanguage from '../classes/south-asian-language.js'
|
|
1
|
+
import { SouthAsianLanguage } from '../classes/south-asian-language.js'
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Punjabi language converter.
|
|
5
|
+
*
|
|
6
|
+
* Supports:
|
|
7
|
+
* - Indian numbering system (ਹਜ਼ਾਰ, ਲੱਖ, ਕਰੋੜ)
|
|
8
|
+
* - Gurmukhi script
|
|
9
|
+
* - Complete word forms for 0-99
|
|
10
|
+
*/
|
|
11
|
+
export class Punjabi extends SouthAsianLanguage {
|
|
4
12
|
negativeWord = 'ਮਾਇਨਸ'
|
|
5
13
|
decimalSeparatorWord = 'ਦਸ਼ਮਲਵ'
|
|
6
14
|
zeroWord = 'ਸਿਫ਼ਰ'
|
|
7
15
|
hundredWord = 'ਸੌ'
|
|
8
|
-
|
|
16
|
+
|
|
17
|
+
belowHundredWords = [
|
|
9
18
|
'ਸਿਫ਼ਰ',
|
|
10
19
|
'ਇੱਕ',
|
|
11
20
|
'ਦੋ',
|
|
@@ -120,7 +129,3 @@ class Punjabi extends SouthAsianLanguage {
|
|
|
120
129
|
'ਸ਼ੰਖ'
|
|
121
130
|
]
|
|
122
131
|
}
|
|
123
|
-
|
|
124
|
-
export default function convertToWords (value, options = {}) {
|
|
125
|
-
return new Punjabi(options).convertToWords(value)
|
|
126
|
-
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Polish language converter.
|
|
3
|
+
*
|
|
4
|
+
* Supports:
|
|
5
|
+
* - Three-form pluralization (one/few/many)
|
|
6
|
+
* - Polish-specific declension patterns
|
|
7
|
+
* - Distinctive Polish phonology and orthography
|
|
8
|
+
*/
|
|
9
|
+
export class Polish extends SlavicLanguage {
|
|
10
|
+
onesWords: {
|
|
11
|
+
1: string;
|
|
12
|
+
2: string;
|
|
13
|
+
3: string;
|
|
14
|
+
4: string;
|
|
15
|
+
5: string;
|
|
16
|
+
6: string;
|
|
17
|
+
7: string;
|
|
18
|
+
8: string;
|
|
19
|
+
9: string;
|
|
20
|
+
};
|
|
21
|
+
onesFeminineWords: {
|
|
22
|
+
1: string;
|
|
23
|
+
2: string;
|
|
24
|
+
3: string;
|
|
25
|
+
4: string;
|
|
26
|
+
5: string;
|
|
27
|
+
6: string;
|
|
28
|
+
7: string;
|
|
29
|
+
8: string;
|
|
30
|
+
9: string;
|
|
31
|
+
};
|
|
32
|
+
teensWords: {
|
|
33
|
+
0: string;
|
|
34
|
+
1: string;
|
|
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
|
+
twentiesWords: {
|
|
45
|
+
2: string;
|
|
46
|
+
3: string;
|
|
47
|
+
4: string;
|
|
48
|
+
5: string;
|
|
49
|
+
6: string;
|
|
50
|
+
7: string;
|
|
51
|
+
8: string;
|
|
52
|
+
9: string;
|
|
53
|
+
};
|
|
54
|
+
hundredsWords: {
|
|
55
|
+
1: string;
|
|
56
|
+
2: string;
|
|
57
|
+
3: string;
|
|
58
|
+
4: string;
|
|
59
|
+
5: string;
|
|
60
|
+
6: string;
|
|
61
|
+
7: string;
|
|
62
|
+
8: string;
|
|
63
|
+
9: string;
|
|
64
|
+
};
|
|
65
|
+
pluralForms: {
|
|
66
|
+
1: string[];
|
|
67
|
+
2: string[];
|
|
68
|
+
3: string[];
|
|
69
|
+
4: string[];
|
|
70
|
+
5: string[];
|
|
71
|
+
6: string[];
|
|
72
|
+
7: string[];
|
|
73
|
+
8: string[];
|
|
74
|
+
9: string[];
|
|
75
|
+
10: string[];
|
|
76
|
+
};
|
|
77
|
+
/** Implements Polish-specific three-form pluralization rules. */
|
|
78
|
+
pluralize(n: any, forms: any): any;
|
|
79
|
+
}
|
|
80
|
+
import { SlavicLanguage } from '../classes/slavic-language.js';
|
package/lib/languages/pl.js
CHANGED
|
@@ -1,39 +1,19 @@
|
|
|
1
|
-
import SlavicLanguage from '../classes/slavic-language.js'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @typedef {Object} SlavicOptions
|
|
5
|
-
* @property {boolean} [feminine=false] Use feminine forms for numbers.
|
|
6
|
-
*/
|
|
1
|
+
import { SlavicLanguage } from '../classes/slavic-language.js'
|
|
7
2
|
|
|
8
3
|
/**
|
|
9
4
|
* Polish language converter.
|
|
10
5
|
*
|
|
11
|
-
*
|
|
12
|
-
* -
|
|
13
|
-
* - Complex Slavic three-form pluralization (tysiąc/tysiące/tysięcy)
|
|
6
|
+
* Supports:
|
|
7
|
+
* - Three-form pluralization (one/few/many)
|
|
14
8
|
* - Polish-specific declension patterns
|
|
15
9
|
* - Distinctive Polish phonology and orthography
|
|
16
|
-
*
|
|
17
|
-
* Key Features:
|
|
18
|
-
* - Three-form pluralization system shared across Slavic languages
|
|
19
|
-
* * Form 1 (singular): 1 (e.g., "tysiąc")
|
|
20
|
-
* * Form 2 (few): 2-4, 22-24, 32-34... excluding teens (e.g., "tysiące")
|
|
21
|
-
* * Form 3 (many): all other numbers (e.g., "tysięcy")
|
|
22
|
-
* - Chunk-based decomposition (splits into groups of 3 digits: ones, thousands, millions, etc.)
|
|
23
|
-
* - Large number handling via thousands[] array with indexed [singular, few, many] forms
|
|
24
|
-
*
|
|
25
|
-
* Features:
|
|
26
|
-
* - Polish diacritical marks (ą, ć, ę, ł, ń, ś, ź, ż)
|
|
27
|
-
* - Gender and case agreement
|
|
28
|
-
* - Polish-specific number word endings
|
|
29
|
-
*
|
|
30
|
-
* Inherits from SlavicLanguage for complex pluralization algorithms.
|
|
31
10
|
*/
|
|
32
11
|
export class Polish extends SlavicLanguage {
|
|
33
12
|
negativeWord = 'minus'
|
|
34
13
|
decimalSeparatorWord = 'przecinek'
|
|
35
14
|
zeroWord = 'zero'
|
|
36
|
-
|
|
15
|
+
|
|
16
|
+
onesWords = {
|
|
37
17
|
1: 'jeden',
|
|
38
18
|
2: 'dwa',
|
|
39
19
|
3: 'trzy',
|
|
@@ -45,7 +25,19 @@ export class Polish extends SlavicLanguage {
|
|
|
45
25
|
9: 'dziewięć'
|
|
46
26
|
}
|
|
47
27
|
|
|
48
|
-
|
|
28
|
+
onesFeminineWords = {
|
|
29
|
+
1: 'jedna',
|
|
30
|
+
2: 'dwie',
|
|
31
|
+
3: 'trzy',
|
|
32
|
+
4: 'cztery',
|
|
33
|
+
5: 'pięć',
|
|
34
|
+
6: 'sześć',
|
|
35
|
+
7: 'siedem',
|
|
36
|
+
8: 'osiem',
|
|
37
|
+
9: 'dziewięć'
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
teensWords = {
|
|
49
41
|
0: 'dziesięć',
|
|
50
42
|
1: 'jedenaście',
|
|
51
43
|
2: 'dwanaście',
|
|
@@ -58,7 +50,7 @@ export class Polish extends SlavicLanguage {
|
|
|
58
50
|
9: 'dziewiętnaście'
|
|
59
51
|
}
|
|
60
52
|
|
|
61
|
-
|
|
53
|
+
twentiesWords = {
|
|
62
54
|
2: 'dwadzieścia',
|
|
63
55
|
3: 'trzydzieści',
|
|
64
56
|
4: 'czterdzieści',
|
|
@@ -69,7 +61,7 @@ export class Polish extends SlavicLanguage {
|
|
|
69
61
|
9: 'dziewięćdziesiąt'
|
|
70
62
|
}
|
|
71
63
|
|
|
72
|
-
|
|
64
|
+
hundredsWords = {
|
|
73
65
|
1: 'sto',
|
|
74
66
|
2: 'dwieście',
|
|
75
67
|
3: 'trzysta',
|
|
@@ -81,7 +73,7 @@ export class Polish extends SlavicLanguage {
|
|
|
81
73
|
9: 'dziewięćset'
|
|
82
74
|
}
|
|
83
75
|
|
|
84
|
-
|
|
76
|
+
pluralForms = {
|
|
85
77
|
1: ['tysiąc', 'tysiące', 'tysięcy'], // 10^ 3
|
|
86
78
|
2: ['milion', 'miliony', 'milionów'], // 10^ 6
|
|
87
79
|
3: ['miliard', 'miliardy', 'miliardów'], // 10^ 9
|
|
@@ -95,17 +87,12 @@ export class Polish extends SlavicLanguage {
|
|
|
95
87
|
}
|
|
96
88
|
|
|
97
89
|
/**
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
* Polish three-form system:
|
|
101
|
-
* - Form 1 (singular): exactly n=1 (e.g., "tysiąc")
|
|
102
|
-
* - Form 2 (few): n ends in 2-4, excluding teens (22-24, 32-34...) (e.g., "tysiące")
|
|
103
|
-
* - Form 3 (many): all other numbers (e.g., "tysięcy")
|
|
104
|
-
*
|
|
105
|
-
* @param {bigint} n The number to classify.
|
|
106
|
-
* @param {Array<string>} forms Array of [singular, few, many] word forms.
|
|
107
|
-
* @returns {string} The appropriate form for the number n.
|
|
90
|
+
* Polish omits "one" before scale words.
|
|
91
|
+
* e.g., 1000 is "tysiąc" not "jeden tysiąc"
|
|
108
92
|
*/
|
|
93
|
+
omitOneBeforeScale = true
|
|
94
|
+
|
|
95
|
+
/** Implements Polish-specific three-form pluralization rules. */
|
|
109
96
|
pluralize (n, forms) {
|
|
110
97
|
if (n === 1n) {
|
|
111
98
|
return forms[0]
|
|
@@ -120,70 +107,4 @@ export class Polish extends SlavicLanguage {
|
|
|
120
107
|
|
|
121
108
|
return forms[2]
|
|
122
109
|
}
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Converts a whole number to Polish cardinal form.
|
|
126
|
-
*
|
|
127
|
-
* Algorithm (chunk-based decomposition):
|
|
128
|
-
* 1. Split number into chunks of 3 digits (right-to-left): ones, thousands, millions, etc.
|
|
129
|
-
* 2. For each non-zero chunk:
|
|
130
|
-
* a. Extract hundreds digit (n3), tens digit (n2), ones digit (n1)
|
|
131
|
-
* b. Add hundreds word (e.g., "sto", "dwieście")
|
|
132
|
-
* c. Add tens/ones (handles teens 10-19 separately from compound tens)
|
|
133
|
-
* d. Add pluralized magnitude word (e.g., "tysiące", "miliony")
|
|
134
|
-
* 3. Join all words with spaces
|
|
135
|
-
*
|
|
136
|
-
* Example: 1234 → chunks [1, 234] → "jeden tysiąc dwieście trzydzieści cztery"
|
|
137
|
-
* - Chunk 1 (index=1, thousands): "jeden" + "tysiąc"
|
|
138
|
-
* - Chunk 234 (index=0): "dwieście" + "trzydzieści" + "cztery"
|
|
139
|
-
*
|
|
140
|
-
* Special case: When chunk=1 at thousands+ levels, omit the ones word to avoid
|
|
141
|
-
* redundancy with the pluralized magnitude (e.g., just "tysiąc" not "jeden tysiąc").
|
|
142
|
-
*
|
|
143
|
-
* @param {bigint} number The whole number to convert.
|
|
144
|
-
* @returns {string} The number expressed in Polish words.
|
|
145
|
-
*/
|
|
146
|
-
convertWholePart (number) {
|
|
147
|
-
if (number === 0n) {
|
|
148
|
-
return this.zeroWord
|
|
149
|
-
}
|
|
150
|
-
const words = []
|
|
151
|
-
const chunks = this.splitByX(number.toString(), 3)
|
|
152
|
-
let index = chunks.length
|
|
153
|
-
for (const x of chunks) {
|
|
154
|
-
index = index - 1
|
|
155
|
-
if (x === 0n) {
|
|
156
|
-
continue
|
|
157
|
-
}
|
|
158
|
-
const [n1, n2, n3] = this.getDigits(x)
|
|
159
|
-
if (n3 > 0n) {
|
|
160
|
-
words.push(this.hundreds[n3])
|
|
161
|
-
}
|
|
162
|
-
if (n2 > 1n) {
|
|
163
|
-
words.push(this.twenties[n2])
|
|
164
|
-
}
|
|
165
|
-
if (n2 === 1n) {
|
|
166
|
-
words.push(this.tens[n1])
|
|
167
|
-
} else if (n1 > 0n && !(index > 0 && x === 1n)) {
|
|
168
|
-
words.push(this.ones[n1])
|
|
169
|
-
}
|
|
170
|
-
if (index > 0) {
|
|
171
|
-
words.push(this.pluralize(x, this.thousands[index]))
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
return words.join(' ')
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* Converts a number to Polish cardinal (written) form.
|
|
180
|
-
*
|
|
181
|
-
* @param {number|string|bigint} value The number to convert.
|
|
182
|
-
* @param {SlavicOptions} [options={}] Configuration options.
|
|
183
|
-
* @returns {string} The number expressed in Polish words.
|
|
184
|
-
* @throws {TypeError} If value is NaN or invalid type.
|
|
185
|
-
* @throws {Error} If value is an invalid number string.
|
|
186
|
-
*/
|
|
187
|
-
export default function convertToWords (value, options = {}) {
|
|
188
|
-
return new Polish(options).convertToWords(value)
|
|
189
110
|
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* (European) Portuguese language converter.
|
|
3
|
+
*
|
|
4
|
+
* Supports:
|
|
5
|
+
* - Gender-aware hundreds (duzentos, trezentos)
|
|
6
|
+
* - "e" (and) conjunction for number combinations
|
|
7
|
+
* - Post-processing to normalize word flow
|
|
8
|
+
*/
|
|
9
|
+
export class Portuguese extends GreedyScaleLanguage {
|
|
10
|
+
static POSTCLEAN_REGEX: RegExp;
|
|
11
|
+
scaleWords: (string | bigint)[][];
|
|
12
|
+
hundredsWords: {
|
|
13
|
+
1: string;
|
|
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
|
+
finalizeWords(words: any): any;
|
|
24
|
+
/** Combines two word-sets according to Portuguese grammar rules. */
|
|
25
|
+
combineWordSets(preceding: any, following: any): {
|
|
26
|
+
[x: string]: any;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js';
|