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/ja.js
CHANGED
|
@@ -1,44 +1,25 @@
|
|
|
1
|
-
import AbstractLanguage from '../classes/abstract-language.js'
|
|
1
|
+
import { AbstractLanguage } from '../classes/abstract-language.js'
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Japanese language converter.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
* -
|
|
8
|
-
* - Grouping by 万 (
|
|
9
|
-
* -
|
|
10
|
-
* - Special rules for 1: omitted before 十 (10), 百 (100), 千 (1000), but kept for 万 and above
|
|
11
|
-
*
|
|
12
|
-
* Key Features:
|
|
13
|
-
* - Sino-Japanese number system (standard for general counting)
|
|
14
|
-
* - Grouping by powers of 10,000 (万-based system, not 1,000)
|
|
15
|
-
* - Scale units: 万 (10^4), 億 (10^8), 兆 (10^12), 京 (10^16)
|
|
16
|
-
* - Special handling of 一 (one) prefix
|
|
17
|
-
* - Support for very large numbers up to 無量大数 (10^68)
|
|
18
|
-
*
|
|
19
|
-
* Algorithm:
|
|
20
|
-
* 1. Split number into groups of 4 digits (万-based, not 3-digit thousand-based)
|
|
21
|
-
* 2. Convert each group to kanji using special rules
|
|
22
|
-
* 3. Append appropriate scale word (万, 億, 兆, etc.)
|
|
23
|
-
* 4. Join all groups
|
|
24
|
-
*
|
|
25
|
-
* Special Rules:
|
|
26
|
-
* - 10, 100, 1000: Don't use 一 prefix (十, 百, 千 not 一十, 一百, 一千)
|
|
27
|
-
* - 10,000+: Keep 一 prefix (一万, 一億, 一兆)
|
|
28
|
-
* - Zero: 零 or 〇 (both acceptable, 零 is more formal)
|
|
6
|
+
* Supports:
|
|
7
|
+
* - Kanji numerals (一, 二, 三, etc.)
|
|
8
|
+
* - Grouping by 万 (10,000) instead of 1,000
|
|
9
|
+
* - Special 一 (one) omission rules (十, 百, 千 but 一万, 一億)
|
|
29
10
|
*/
|
|
30
11
|
export class Japanese extends AbstractLanguage {
|
|
31
12
|
negativeWord = 'マイナス'
|
|
32
13
|
decimalSeparatorWord = '点'
|
|
33
14
|
zeroWord = '零'
|
|
34
15
|
wordSeparator = '' // Japanese doesn't use spaces between characters
|
|
35
|
-
|
|
16
|
+
usePerDigitDecimals = true // Enable digit-by-digit decimal conversion
|
|
36
17
|
|
|
37
|
-
//
|
|
38
|
-
|
|
18
|
+
// Ones words used for group conversion (1-9)
|
|
19
|
+
onesWords = ['一', '二', '三', '四', '五', '六', '七', '八', '九']
|
|
39
20
|
|
|
40
21
|
// Scale words for grouping by 10^4
|
|
41
|
-
|
|
22
|
+
scaleWords = [
|
|
42
23
|
'', // 10^0 (ones)
|
|
43
24
|
'万', // 10^4 (man)
|
|
44
25
|
'億', // 10^8 (oku)
|
|
@@ -59,19 +40,8 @@ export class Japanese extends AbstractLanguage {
|
|
|
59
40
|
'無量大数' // 10^68 (muryōtaisū)
|
|
60
41
|
]
|
|
61
42
|
|
|
62
|
-
/**
|
|
63
|
-
|
|
64
|
-
* Handles special rules for omitting 一 before 十, 百, 千.
|
|
65
|
-
*
|
|
66
|
-
* Rule: Within a group, omit 一 before 十/百/千 EXCEPT when:
|
|
67
|
-
* - It's a lower group (not isTopGroup) AND
|
|
68
|
-
* - It would be the only character in that position
|
|
69
|
-
*
|
|
70
|
-
* @param {bigint} num - Number from 0 to 9999
|
|
71
|
-
* @param {boolean} isTopGroup - Whether this is the highest non-zero group
|
|
72
|
-
* @returns {string} Japanese kanji representation
|
|
73
|
-
*/
|
|
74
|
-
convertGroup (num, isTopGroup = false) {
|
|
43
|
+
/** Converts a segment of up to 4 digits to Japanese kanji with 一 omission rules. */
|
|
44
|
+
segmentToWords (num) {
|
|
75
45
|
if (num === 0n) return ''
|
|
76
46
|
|
|
77
47
|
const thousands = num / 1000n
|
|
@@ -87,7 +57,7 @@ export class Japanese extends AbstractLanguage {
|
|
|
87
57
|
if (thousands === 1n) {
|
|
88
58
|
result += '千'
|
|
89
59
|
} else {
|
|
90
|
-
result += this.
|
|
60
|
+
result += this.onesWords[Number(thousands) - 1] + '千'
|
|
91
61
|
}
|
|
92
62
|
}
|
|
93
63
|
|
|
@@ -97,7 +67,7 @@ export class Japanese extends AbstractLanguage {
|
|
|
97
67
|
if (hundreds === 1n) {
|
|
98
68
|
result += '百'
|
|
99
69
|
} else {
|
|
100
|
-
result += this.
|
|
70
|
+
result += this.onesWords[Number(hundreds) - 1] + '百'
|
|
101
71
|
}
|
|
102
72
|
}
|
|
103
73
|
|
|
@@ -107,30 +77,25 @@ export class Japanese extends AbstractLanguage {
|
|
|
107
77
|
if (tens === 1n) {
|
|
108
78
|
result += '十'
|
|
109
79
|
} else {
|
|
110
|
-
result += this.
|
|
80
|
+
result += this.onesWords[Number(tens) - 1] + '十'
|
|
111
81
|
}
|
|
112
82
|
}
|
|
113
83
|
|
|
114
84
|
// Ones
|
|
115
85
|
if (ones > 0n) {
|
|
116
|
-
result += this.
|
|
86
|
+
result += this.onesWords[Number(ones) - 1]
|
|
117
87
|
}
|
|
118
88
|
|
|
119
89
|
return result
|
|
120
90
|
}
|
|
121
91
|
|
|
122
|
-
/**
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
* @param {bigint} number - The number to convert
|
|
126
|
-
* @returns {string} Japanese kanji representation
|
|
127
|
-
*/
|
|
128
|
-
convertWholePart (number) {
|
|
129
|
-
if (number === 0n) {
|
|
92
|
+
/** Converts integer part using Japanese 万-based grouping system. */
|
|
93
|
+
integerToWords (integerPart) {
|
|
94
|
+
if (integerPart === 0n) {
|
|
130
95
|
return this.zeroWord
|
|
131
96
|
}
|
|
132
97
|
|
|
133
|
-
let temp =
|
|
98
|
+
let temp = integerPart
|
|
134
99
|
let scaleIndex = 0
|
|
135
100
|
const groups = []
|
|
136
101
|
|
|
@@ -151,17 +116,16 @@ export class Japanese extends AbstractLanguage {
|
|
|
151
116
|
|
|
152
117
|
for (let i = 0; i < groups.length; i++) {
|
|
153
118
|
const { value, scale } = groups[i]
|
|
154
|
-
const isTopGroup = (i === 0)
|
|
155
119
|
|
|
156
|
-
const groupStr = this.
|
|
120
|
+
const groupStr = this.segmentToWords(value)
|
|
157
121
|
|
|
158
122
|
// For scales >= 1 (万 and above), always add the scale word
|
|
159
123
|
if (scale >= 1) {
|
|
160
124
|
// Special case: if group is 1 and scale >= 1, we need 一 before the scale
|
|
161
125
|
if (value === 1n) {
|
|
162
|
-
result += '一' + this.
|
|
126
|
+
result += '一' + this.scaleWords[scale]
|
|
163
127
|
} else {
|
|
164
|
-
result += groupStr + this.
|
|
128
|
+
result += groupStr + this.scaleWords[scale]
|
|
165
129
|
}
|
|
166
130
|
} else {
|
|
167
131
|
result += groupStr
|
|
@@ -171,20 +135,3 @@ export class Japanese extends AbstractLanguage {
|
|
|
171
135
|
return result
|
|
172
136
|
}
|
|
173
137
|
}
|
|
174
|
-
|
|
175
|
-
/**
|
|
176
|
-
* Converts a value to cardinal (written) form in Japanese.
|
|
177
|
-
*
|
|
178
|
-
* @param {number|string|bigint} value - Number to convert.
|
|
179
|
-
* @param {Object} [options] - Options for the converter.
|
|
180
|
-
* @returns {string} Value in Japanese kanji numerals.
|
|
181
|
-
* @throws {Error} If value is invalid.
|
|
182
|
-
*
|
|
183
|
-
* @example
|
|
184
|
-
* convertToWords(42, { lang: 'ja' }); // '四十二'
|
|
185
|
-
* convertToWords(1000, { lang: 'ja' }); // '千'
|
|
186
|
-
* convertToWords(10000, { lang: 'ja' }); // '一万'
|
|
187
|
-
*/
|
|
188
|
-
export default function convertToWords (value, options = {}) {
|
|
189
|
-
return new Japanese(options).convertToWords(value)
|
|
190
|
-
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kannada language converter.
|
|
3
|
+
*
|
|
4
|
+
* Supports:
|
|
5
|
+
* - Indian numbering system (ಸಾವಿರ, ಲಕ್ಷ, ಕೋಟಿ)
|
|
6
|
+
* - Kannada script
|
|
7
|
+
* - Complete word forms for 0-99
|
|
8
|
+
*/
|
|
9
|
+
export class Kannada extends SouthAsianLanguage {
|
|
10
|
+
}
|
|
11
|
+
import { SouthAsianLanguage } from '../classes/south-asian-language.js';
|
package/lib/languages/kn.js
CHANGED
|
@@ -1,27 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
* Converts numbers to their word representation in Kannada (ಕನ್ನಡ).
|
|
3
|
-
* @module languages/kn
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import SouthAsianLanguage from '../classes/south-asian-language.js'
|
|
1
|
+
import { SouthAsianLanguage } from '../classes/south-asian-language.js'
|
|
7
2
|
|
|
8
3
|
/**
|
|
9
|
-
* Kannada language
|
|
10
|
-
*
|
|
4
|
+
* Kannada language converter.
|
|
5
|
+
*
|
|
6
|
+
* Supports:
|
|
7
|
+
* - Indian numbering system (ಸಾವಿರ, ಲಕ್ಷ, ಕೋಟಿ)
|
|
8
|
+
* - Kannada script
|
|
9
|
+
* - Complete word forms for 0-99
|
|
11
10
|
*/
|
|
12
|
-
class
|
|
11
|
+
export class Kannada extends SouthAsianLanguage {
|
|
13
12
|
negativeWord = 'ಋಣಾತ್ಮಕ'
|
|
14
13
|
decimalSeparatorWord = 'ದಶಮಾಂಶ'
|
|
15
14
|
zeroWord = 'ಸೊನ್ನೆ'
|
|
16
15
|
hundredWord = 'ನೂರು'
|
|
17
|
-
|
|
16
|
+
usePerDigitDecimals = true
|
|
18
17
|
|
|
19
|
-
|
|
20
|
-
* Array of number words from 0 to 99.
|
|
21
|
-
* Index matches the number value.
|
|
22
|
-
* @type {string[]}
|
|
23
|
-
*/
|
|
24
|
-
belowHundred = [
|
|
18
|
+
belowHundredWords = [
|
|
25
19
|
'ಸೊನ್ನೆ', 'ಒಂದು', 'ಎರಡು', 'ಮೂರು', 'ನಾಲ್ಕು', 'ಐದು', 'ಆರು', 'ಏಳು', 'ಎಂಟು', 'ಒಂಬತ್ತು',
|
|
26
20
|
'ಹತ್ತು', 'ಹನ್ನೊಂದು', 'ಹನ್ನೆರಡು', 'ಹದಿಮೂರು', 'ಹದಿನಾಲ್ಕು', 'ಹದಿನೈದು', 'ಹದಿನಾರು', 'ಹದಿನೇಳು', 'ಹದಿನೆಂಟು', 'ಹತ್ತೊಂಬತ್ತು',
|
|
27
21
|
'ಇಪ್ಪತ್ತು', 'ಇಪ್ಪತ್ತೊಂದು', 'ಇಪ್ಪತ್ತೆರಡು', 'ಇಪ್ಪತ್ತಮೂರು', 'ಇಪ್ಪತ್ತನಾಲ್ಕು', 'ಇಪ್ಪತ್ತೈದು', 'ಇಪ್ಪತ್ತಾರು', 'ಇಪ್ಪತ್ತೇಳು', 'ಇಪ್ಪತ್ತೆಂಟು', 'ಇಪ್ಪತ್ತೊಂಬತ್ತು',
|
|
@@ -34,11 +28,6 @@ class KannadaLanguage extends SouthAsianLanguage {
|
|
|
34
28
|
'ತೊಂಬತ್ತು', 'ತೊಂಬತ್ತೊಂದು', 'ತೊಂಬತ್ತೆರಡು', 'ತೊಂಬತ್ತಮೂರು', 'ತೊಂಬತ್ತನಾಲ್ಕು', 'ತೊಂಬತ್ತೈದು', 'ತೊಂಬತ್ತಾರು', 'ತೊಂಬತ್ತೇಳು', 'ತೊಂಬತ್ತೆಂಟು', 'ತೊಂಬತ್ತೊಂಬತ್ತು'
|
|
35
29
|
]
|
|
36
30
|
|
|
37
|
-
/**
|
|
38
|
-
* Scale words for powers of ten in Indian numbering system.
|
|
39
|
-
* Index 0 = units, 1 = thousand, 2 = lakh, 3 = crore, etc.
|
|
40
|
-
* @type {string[]}
|
|
41
|
-
*/
|
|
42
31
|
scaleWords = [
|
|
43
32
|
'', // units
|
|
44
33
|
'ಸಾವಿರ', // thousand (1,000)
|
|
@@ -50,22 +39,4 @@ class KannadaLanguage extends SouthAsianLanguage {
|
|
|
50
39
|
'ಪದ್ಮ', // padma (1,000,000,000,000,000)
|
|
51
40
|
'ಶಂಖ' // shankh (100,000,000,000,000,000)
|
|
52
41
|
]
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Converts numbers using the belowHundred array directly.
|
|
56
|
-
*/
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Converts a number to its word representation in Kannada.
|
|
61
|
-
* @param {number|string|bigint} value - The number to convert
|
|
62
|
-
* @param {Object} [options={}] - Conversion options
|
|
63
|
-
* @returns {string} The word representation of the number
|
|
64
|
-
* @example
|
|
65
|
-
* convertToWords(42) // 'ನಲವತ್ತೆರಡು'
|
|
66
|
-
* convertToWords(1000) // 'ಒಂದು ಸಾವಿರ'
|
|
67
|
-
* convertToWords(100000) // 'ಒಂದು ಲಕ್ಷ'
|
|
68
|
-
*/
|
|
69
|
-
export default function convertToWords (value, options = {}) {
|
|
70
|
-
return new KannadaLanguage(options).convertToWords(value)
|
|
71
42
|
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Korean language converter.
|
|
3
|
+
*
|
|
4
|
+
* Supports:
|
|
5
|
+
* - Hangul numerals (일, 이, 삼, etc.)
|
|
6
|
+
* - Grouping by 만 (10,000) system
|
|
7
|
+
* - Implicit '일' (one) omission before multipliers
|
|
8
|
+
*/
|
|
9
|
+
export class Korean extends GreedyScaleLanguage {
|
|
10
|
+
scaleWords: (string | bigint)[][];
|
|
11
|
+
/** Combines two word-sets according to Korean grammar rules. */
|
|
12
|
+
combineWordSets(preceding: any, following: any): any;
|
|
13
|
+
}
|
|
14
|
+
import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js';
|
package/lib/languages/ko.js
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
|
-
import GreedyScaleLanguage from '../classes/greedy-scale-language.js'
|
|
1
|
+
import { GreedyScaleLanguage } from '../classes/greedy-scale-language.js'
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Korean language converter.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
* -
|
|
8
|
-
* -
|
|
9
|
-
* -
|
|
6
|
+
* Supports:
|
|
7
|
+
* - Hangul numerals (일, 이, 삼, etc.)
|
|
8
|
+
* - Grouping by 만 (10,000) system
|
|
9
|
+
* - Implicit '일' (one) omission before multipliers
|
|
10
10
|
*/
|
|
11
11
|
export class Korean extends GreedyScaleLanguage {
|
|
12
12
|
negativeWord = '마이너스'
|
|
13
13
|
decimalSeparatorWord = '점'
|
|
14
14
|
zeroWord = '영'
|
|
15
|
-
|
|
15
|
+
|
|
16
|
+
scaleWords = [
|
|
16
17
|
[10_000_000_000_000_000_000_000_000_000n, '양'],
|
|
17
18
|
[1_000_000_000_000_000_000_000_000n, '자'],
|
|
18
19
|
[100_000_000_000_000_000_000n, '해'],
|
|
@@ -35,49 +36,20 @@ export class Korean extends GreedyScaleLanguage {
|
|
|
35
36
|
[0n, '영']
|
|
36
37
|
]
|
|
37
38
|
|
|
38
|
-
/**
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
* - Separates with space for large numbers (>= 만)
|
|
45
|
-
* - Multiplies when right > left, adds when left > right
|
|
46
|
-
*
|
|
47
|
-
* @param {Object} leftPair The left operand as `{ word: number }`.
|
|
48
|
-
* @param {Object} rightPair The right operand as `{ word: number }`.
|
|
49
|
-
* @returns {Object} Merged pair with combined word and resulting number.
|
|
50
|
-
*/
|
|
51
|
-
mergeScales (leftPair, rightPair) {
|
|
52
|
-
const leftWord = Object.keys(leftPair)[0]
|
|
53
|
-
const rightWord = Object.keys(rightPair)[0]
|
|
54
|
-
const leftNumber = Object.values(leftPair)[0] // BigInt
|
|
55
|
-
const rightNumber = Object.values(rightPair)[0] // BigInt
|
|
39
|
+
/** Combines two word-sets according to Korean grammar rules. */
|
|
40
|
+
combineWordSets (preceding, following) {
|
|
41
|
+
const precedingWord = Object.keys(preceding)[0]
|
|
42
|
+
const followingWord = Object.keys(following)[0]
|
|
43
|
+
const precedingValue = Object.values(preceding)[0] // BigInt
|
|
44
|
+
const followingValue = Object.values(following)[0] // BigInt
|
|
56
45
|
|
|
57
46
|
// Implicit "일": omit 1 before multipliers up to 만 (10,000)
|
|
58
|
-
if (
|
|
47
|
+
if (precedingValue === 1n && followingValue <= 10_000n) return following
|
|
59
48
|
// Concatenate (no space) for small numbers less than 만
|
|
60
|
-
if (
|
|
49
|
+
if (precedingValue < 10_000n && precedingValue > followingValue) return { [`${precedingWord}${followingWord}`]: precedingValue + followingValue }
|
|
61
50
|
// Space-separate for large numbers (>= 만) when adding
|
|
62
|
-
if (
|
|
51
|
+
if (precedingValue >= 10_000n && precedingValue > followingValue) return { [`${precedingWord} ${followingWord}`]: precedingValue + followingValue }
|
|
63
52
|
// Multiply for all scale combinations
|
|
64
|
-
return { [`${
|
|
53
|
+
return { [`${precedingWord}${followingWord}`]: precedingValue * followingValue }
|
|
65
54
|
}
|
|
66
55
|
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Converts a number to Korean cardinal (written) form.
|
|
70
|
-
*
|
|
71
|
-
* @param {number|string|bigint} value The number to convert.
|
|
72
|
-
* @param {Object} [options] Conversion options (see Korean class options).
|
|
73
|
-
* @returns {string} The number expressed in Korean words.
|
|
74
|
-
* @throws {TypeError} If value is NaN or invalid type.
|
|
75
|
-
* @throws {Error} If value is an invalid number string.
|
|
76
|
-
*
|
|
77
|
-
* @example
|
|
78
|
-
* convertToWords(42); // '사십이'
|
|
79
|
-
* convertToWords(10001); // '만 일'
|
|
80
|
-
*/
|
|
81
|
-
export default function convertToWords (value, options = {}) {
|
|
82
|
-
return new Korean(options).convertToWords(value)
|
|
83
|
-
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lithuanian language converter.
|
|
3
|
+
*
|
|
4
|
+
* Supports:
|
|
5
|
+
* - Three-form pluralization (one/few/many)
|
|
6
|
+
* - Gender agreement (vienas/viena, du/dvi)
|
|
7
|
+
* - Baltic declension patterns
|
|
8
|
+
*/
|
|
9
|
+
export class Lithuanian 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: string[];
|
|
55
|
+
pluralForms: {
|
|
56
|
+
1: string[];
|
|
57
|
+
2: string[];
|
|
58
|
+
3: string[];
|
|
59
|
+
4: string[];
|
|
60
|
+
5: string[];
|
|
61
|
+
6: string[];
|
|
62
|
+
7: string[];
|
|
63
|
+
8: string[];
|
|
64
|
+
9: string[];
|
|
65
|
+
10: string[];
|
|
66
|
+
};
|
|
67
|
+
pluralize(n: any, forms: any): any;
|
|
68
|
+
integerToWords(integerPart: any): string;
|
|
69
|
+
}
|
|
70
|
+
import { SlavicLanguage } from '../classes/slavic-language.js';
|
package/lib/languages/lt.js
CHANGED
|
@@ -1,40 +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
|
* Lithuanian language converter.
|
|
10
5
|
*
|
|
11
|
-
*
|
|
12
|
-
* -
|
|
13
|
-
* - Gender
|
|
14
|
-
* - Baltic
|
|
15
|
-
* - Lithuanian-specific declension patterns
|
|
16
|
-
*
|
|
17
|
-
* Key Features:
|
|
18
|
-
* - Three-form pluralization system shared across Slavic/Baltic languages
|
|
19
|
-
* * Form 1 (singular): 1 (e.g., "tūkstantis")
|
|
20
|
-
* * Form 2 (few): 2-4, 22-24, 32-34... excluding teens (e.g., "tūkstančiai")
|
|
21
|
-
* * Form 3 (many): all other numbers (e.g., "tūkstančių")
|
|
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
|
-
* - Gender-specific number forms for 1 and 2 (masculine/feminine dual forms)
|
|
25
|
-
*
|
|
26
|
-
* Features:
|
|
27
|
-
* - Dual gender forms (vienas/viena, du/dvi, keturi/keturios)
|
|
28
|
-
* - Complex declension patterns for large numbers
|
|
29
|
-
* - Baltic language characteristics
|
|
30
|
-
*
|
|
31
|
-
* Inherits from SlavicLanguage as Lithuanian uses similar pluralization.
|
|
6
|
+
* Supports:
|
|
7
|
+
* - Three-form pluralization (one/few/many)
|
|
8
|
+
* - Gender agreement (vienas/viena, du/dvi)
|
|
9
|
+
* - Baltic declension patterns
|
|
32
10
|
*/
|
|
33
11
|
export class Lithuanian extends SlavicLanguage {
|
|
34
12
|
negativeWord = 'minus'
|
|
35
13
|
decimalSeparatorWord = 'kablelis'
|
|
36
14
|
zeroWord = 'nulis'
|
|
37
|
-
|
|
15
|
+
|
|
16
|
+
onesWords = {
|
|
38
17
|
1: 'vienas',
|
|
39
18
|
2: 'du',
|
|
40
19
|
3: 'trys',
|
|
@@ -46,7 +25,7 @@ export class Lithuanian extends SlavicLanguage {
|
|
|
46
25
|
9: 'devyni'
|
|
47
26
|
}
|
|
48
27
|
|
|
49
|
-
|
|
28
|
+
onesFeminineWords = {
|
|
50
29
|
1: 'viena',
|
|
51
30
|
2: 'dvi',
|
|
52
31
|
3: 'trys',
|
|
@@ -58,7 +37,7 @@ export class Lithuanian extends SlavicLanguage {
|
|
|
58
37
|
9: 'devynios'
|
|
59
38
|
}
|
|
60
39
|
|
|
61
|
-
|
|
40
|
+
teensWords = {
|
|
62
41
|
0: 'dešimt',
|
|
63
42
|
1: 'vienuolika',
|
|
64
43
|
2: 'dvylika',
|
|
@@ -71,7 +50,7 @@ export class Lithuanian extends SlavicLanguage {
|
|
|
71
50
|
9: 'devyniolika'
|
|
72
51
|
}
|
|
73
52
|
|
|
74
|
-
|
|
53
|
+
twentiesWords = {
|
|
75
54
|
2: 'dvidešimt',
|
|
76
55
|
3: 'trisdešimt',
|
|
77
56
|
4: 'keturiasdešimt',
|
|
@@ -82,9 +61,9 @@ export class Lithuanian extends SlavicLanguage {
|
|
|
82
61
|
9: 'devyniasdešimt'
|
|
83
62
|
}
|
|
84
63
|
|
|
85
|
-
|
|
64
|
+
hundredsWords = ['šimtas', 'šimtai']
|
|
86
65
|
|
|
87
|
-
|
|
66
|
+
pluralForms = {
|
|
88
67
|
1: ['tūkstantis', 'tūkstančiai', 'tūkstančių'],
|
|
89
68
|
2: ['milijonas', 'milijonai', 'milijonų'],
|
|
90
69
|
3: ['milijardas', 'milijardai', 'milijardų'],
|
|
@@ -102,7 +81,7 @@ export class Lithuanian extends SlavicLanguage {
|
|
|
102
81
|
return forms[2]
|
|
103
82
|
}
|
|
104
83
|
|
|
105
|
-
const [n1, n2] = this.
|
|
84
|
+
const [n1, n2] = this.extractDigits(n)
|
|
106
85
|
|
|
107
86
|
if (n2 === 1n || n1 === 0n) {
|
|
108
87
|
return forms[2]
|
|
@@ -115,57 +94,43 @@ export class Lithuanian extends SlavicLanguage {
|
|
|
115
94
|
return forms[1]
|
|
116
95
|
}
|
|
117
96
|
|
|
118
|
-
|
|
119
|
-
if (
|
|
97
|
+
integerToWords (integerPart) {
|
|
98
|
+
if (integerPart === 0n) {
|
|
120
99
|
return this.zeroWord
|
|
121
100
|
}
|
|
122
101
|
const words = []
|
|
123
|
-
const
|
|
124
|
-
let index =
|
|
125
|
-
for (const x of
|
|
102
|
+
const segments = this.splitToSegments(integerPart.toString(), 3)
|
|
103
|
+
let index = segments.length
|
|
104
|
+
for (const x of segments) {
|
|
126
105
|
index = index - 1
|
|
127
106
|
if (x === 0n) {
|
|
128
107
|
continue
|
|
129
108
|
}
|
|
130
|
-
const [n1, n2, n3] = this.
|
|
109
|
+
const [n1, n2, n3] = this.extractDigits(x)
|
|
131
110
|
if (n3 > 0n) {
|
|
132
|
-
words.push(this.
|
|
111
|
+
words.push(this.onesWords[n3])
|
|
133
112
|
if (n3 > 1n) {
|
|
134
|
-
words.push(this.
|
|
113
|
+
words.push(this.hundredsWords[1])
|
|
135
114
|
} else {
|
|
136
|
-
words.push(this.
|
|
115
|
+
words.push(this.hundredsWords[0])
|
|
137
116
|
}
|
|
138
117
|
}
|
|
139
118
|
if (n2 > 1n) {
|
|
140
|
-
words.push(this.
|
|
119
|
+
words.push(this.twentiesWords[n2])
|
|
141
120
|
}
|
|
142
121
|
if (n2 === 1n) {
|
|
143
|
-
words.push(this.
|
|
122
|
+
words.push(this.teensWords[n1])
|
|
144
123
|
} else if (n1 > 0n) {
|
|
145
|
-
if ((index === 1 || (this.feminine && index === 0)) &&
|
|
146
|
-
words.push(this.
|
|
124
|
+
if ((index === 1 || (this.options.gender === 'feminine' && index === 0)) && integerPart < 1000n) {
|
|
125
|
+
words.push(this.onesFeminineWords[n1])
|
|
147
126
|
} else {
|
|
148
|
-
words.push(this.
|
|
127
|
+
words.push(this.onesWords[n1])
|
|
149
128
|
}
|
|
150
129
|
}
|
|
151
130
|
if (index > 0) {
|
|
152
|
-
words.push(this.pluralize(x, this.
|
|
131
|
+
words.push(this.pluralize(x, this.pluralForms[index]))
|
|
153
132
|
}
|
|
154
133
|
}
|
|
155
134
|
return words.join(' ')
|
|
156
135
|
}
|
|
157
136
|
}
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Converts a number to Lithuanian cardinal (written) form.
|
|
161
|
-
*
|
|
162
|
-
* @param {number|string|bigint} value The number to convert.
|
|
163
|
-
* @param {Object} [options={}] Configuration options.
|
|
164
|
-
* @param {boolean} [options.feminine=false] Use feminine forms for numbers.
|
|
165
|
-
* @returns {string} The number expressed in Lithuanian words.
|
|
166
|
-
* @throws {TypeError} If value is NaN or invalid type.
|
|
167
|
-
* @throws {Error} If value is an invalid number string.
|
|
168
|
-
*/
|
|
169
|
-
export default function convertToWords (value, options = {}) {
|
|
170
|
-
return new Lithuanian(options).convertToWords(value)
|
|
171
|
-
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Latvian language converter.
|
|
3
|
+
*
|
|
4
|
+
* Supports:
|
|
5
|
+
* - Three-form pluralization (one/few/many)
|
|
6
|
+
* - Latvian diacritical marks (ī, ā, ē, ū)
|
|
7
|
+
* - Compound number formation (divdesmit, trīsdesmit)
|
|
8
|
+
*/
|
|
9
|
+
export class Latvian 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: string[];
|
|
55
|
+
pluralForms: {
|
|
56
|
+
1: string[];
|
|
57
|
+
2: string[];
|
|
58
|
+
3: string[];
|
|
59
|
+
4: string[];
|
|
60
|
+
5: string[];
|
|
61
|
+
6: string[];
|
|
62
|
+
7: string[];
|
|
63
|
+
8: string[];
|
|
64
|
+
9: string[];
|
|
65
|
+
10: string[];
|
|
66
|
+
};
|
|
67
|
+
pluralize(n: any, forms: any): any;
|
|
68
|
+
integerToWords(integerPart: any): string;
|
|
69
|
+
}
|
|
70
|
+
import { SlavicLanguage } from '../classes/slavic-language.js';
|