n2words 5.0.0 → 5.1.1
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 +133 -40
- package/README.md +6 -4
- package/dist/am-ET.js +2 -2
- package/dist/am-ET.umd.js +2 -2
- package/dist/am-Latn-ET.js +2 -2
- package/dist/am-Latn-ET.umd.js +2 -2
- package/dist/ar-SA.js +2 -2
- package/dist/ar-SA.umd.js +2 -2
- package/dist/az-AZ.js +2 -2
- package/dist/az-AZ.umd.js +2 -2
- package/dist/bn-BD.js +2 -2
- package/dist/bn-BD.umd.js +2 -2
- package/dist/cs-CZ.js +2 -2
- package/dist/cs-CZ.umd.js +2 -2
- package/dist/da-DK.js +2 -2
- package/dist/da-DK.umd.js +2 -2
- package/dist/de-DE.js +2 -2
- package/dist/de-DE.umd.js +2 -2
- package/dist/el-GR.js +2 -2
- package/dist/el-GR.umd.js +2 -2
- package/dist/en-AU.js +2 -2
- package/dist/en-AU.umd.js +2 -2
- package/dist/en-BD.js +2 -2
- package/dist/en-BD.umd.js +2 -2
- package/dist/en-CA.js +2 -2
- package/dist/en-CA.umd.js +2 -2
- package/dist/en-GB.js +2 -2
- package/dist/en-GB.umd.js +2 -2
- package/dist/en-GH.js +2 -2
- package/dist/en-GH.umd.js +2 -2
- package/dist/en-IE.js +2 -2
- package/dist/en-IE.umd.js +2 -2
- package/dist/en-IN.js +2 -2
- package/dist/en-IN.umd.js +2 -2
- package/dist/en-KE.js +2 -2
- package/dist/en-KE.umd.js +2 -2
- package/dist/en-MY.js +2 -2
- package/dist/en-MY.umd.js +2 -2
- package/dist/en-NG.js +2 -2
- package/dist/en-NG.umd.js +2 -2
- package/dist/en-NZ.js +2 -2
- package/dist/en-NZ.umd.js +2 -2
- package/dist/en-PH.js +2 -2
- package/dist/en-PH.umd.js +2 -2
- package/dist/en-PK.js +2 -2
- package/dist/en-PK.umd.js +2 -2
- package/dist/en-SG.js +2 -2
- package/dist/en-SG.umd.js +2 -2
- package/dist/en-US.js +2 -2
- package/dist/en-US.umd.js +2 -2
- package/dist/en-ZA.js +2 -2
- package/dist/en-ZA.umd.js +2 -2
- package/dist/es-ES.js +2 -2
- package/dist/es-ES.umd.js +2 -2
- package/dist/es-MX.js +2 -2
- package/dist/es-MX.umd.js +2 -2
- package/dist/es-US.js +2 -2
- package/dist/es-US.umd.js +2 -2
- package/dist/fa-IR.js +2 -2
- package/dist/fa-IR.umd.js +2 -2
- package/dist/fi-FI.js +2 -2
- package/dist/fi-FI.umd.js +2 -2
- package/dist/fil-PH.js +2 -2
- package/dist/fil-PH.umd.js +2 -2
- package/dist/fr-BE.js +2 -2
- package/dist/fr-BE.umd.js +2 -2
- package/dist/fr-FR.js +2 -2
- package/dist/fr-FR.umd.js +2 -2
- package/dist/gu-IN.js +2 -2
- package/dist/gu-IN.umd.js +2 -2
- package/dist/ha-NG.js +2 -2
- package/dist/ha-NG.umd.js +2 -2
- package/dist/hbo-IL.js +2 -2
- package/dist/hbo-IL.umd.js +2 -2
- package/dist/he-IL.js +2 -2
- package/dist/he-IL.umd.js +2 -2
- package/dist/hi-IN.js +2 -2
- package/dist/hi-IN.umd.js +2 -2
- package/dist/hr-HR.js +2 -2
- package/dist/hr-HR.umd.js +2 -2
- package/dist/hu-HU.js +2 -2
- package/dist/hu-HU.umd.js +2 -2
- package/dist/id-ID.js +2 -2
- package/dist/id-ID.umd.js +2 -2
- package/dist/it-IT.js +2 -2
- package/dist/it-IT.umd.js +2 -2
- package/dist/ja-JP.js +2 -2
- package/dist/ja-JP.umd.js +2 -2
- package/dist/ka-GE.js +2 -2
- package/dist/ka-GE.umd.js +2 -2
- package/dist/kn-IN.js +2 -2
- package/dist/kn-IN.umd.js +2 -2
- package/dist/ko-KR.js +2 -2
- package/dist/ko-KR.umd.js +2 -2
- package/dist/lt-LT.js +2 -2
- package/dist/lt-LT.umd.js +2 -2
- package/dist/lv-LV.js +2 -2
- package/dist/lv-LV.umd.js +2 -2
- package/dist/mr-IN.js +2 -2
- package/dist/mr-IN.umd.js +2 -2
- package/dist/ms-MY.js +2 -2
- package/dist/ms-MY.umd.js +2 -2
- package/dist/nb-NO.js +2 -2
- package/dist/nb-NO.umd.js +2 -2
- package/dist/nl-NL.js +2 -2
- package/dist/nl-NL.umd.js +2 -2
- package/dist/pa-IN.js +2 -2
- package/dist/pa-IN.umd.js +2 -2
- package/dist/pl-PL.js +2 -2
- package/dist/pl-PL.umd.js +2 -2
- package/dist/pt-BR.js +2 -2
- package/dist/pt-BR.umd.js +2 -2
- package/dist/pt-PT.js +2 -2
- package/dist/pt-PT.umd.js +2 -2
- package/dist/ro-RO.js +2 -2
- package/dist/ro-RO.umd.js +2 -2
- package/dist/ru-RU.js +2 -2
- package/dist/ru-RU.umd.js +2 -2
- package/dist/sr-Cyrl-RS.js +2 -2
- package/dist/sr-Cyrl-RS.umd.js +2 -2
- package/dist/sr-Latn-RS.js +2 -2
- package/dist/sr-Latn-RS.umd.js +2 -2
- package/dist/sv-SE.js +2 -2
- package/dist/sv-SE.umd.js +2 -2
- package/dist/sw-KE.js +2 -2
- package/dist/sw-KE.umd.js +2 -2
- package/dist/ta-IN.js +2 -2
- package/dist/ta-IN.umd.js +2 -2
- package/dist/te-IN.js +2 -2
- package/dist/te-IN.umd.js +2 -2
- package/dist/th-TH.js +2 -2
- package/dist/th-TH.umd.js +2 -2
- package/dist/tr-TR.js +2 -2
- package/dist/tr-TR.umd.js +2 -2
- package/dist/uk-UA.js +2 -2
- package/dist/uk-UA.umd.js +2 -2
- package/dist/ur-PK.js +2 -2
- package/dist/ur-PK.umd.js +2 -2
- package/dist/vi-VN.js +2 -2
- package/dist/vi-VN.umd.js +2 -2
- package/dist/yo-NG.js +2 -2
- package/dist/yo-NG.umd.js +2 -2
- package/dist/zh-Hans-CN.js +2 -2
- package/dist/zh-Hans-CN.umd.js +2 -2
- package/dist/zh-Hant-TW.js +2 -2
- package/dist/zh-Hant-TW.umd.js +2 -2
- package/package.json +33 -24
- package/src/am-ET.d.ts +3 -5
- package/src/am-ET.js +41 -16
- package/src/am-Latn-ET.d.ts +3 -5
- package/src/am-Latn-ET.js +45 -16
- package/src/ar-SA.d.ts +44 -18
- package/src/ar-SA.js +93 -40
- package/src/az-AZ.d.ts +3 -5
- package/src/az-AZ.js +58 -20
- package/src/bn-BD.d.ts +3 -5
- package/src/bn-BD.js +32 -16
- package/src/cs-CZ.d.ts +3 -6
- package/src/cs-CZ.js +66 -42
- package/src/da-DK.d.ts +3 -6
- package/src/da-DK.js +53 -48
- package/src/de-DE.d.ts +17 -11
- package/src/de-DE.js +88 -57
- package/src/el-GR.d.ts +3 -6
- package/src/el-GR.js +45 -32
- package/src/en-AU.d.ts +17 -11
- package/src/en-AU.js +56 -41
- package/src/en-BD.d.ts +17 -11
- package/src/en-BD.js +60 -41
- package/src/en-CA.d.ts +36 -18
- package/src/en-CA.js +67 -46
- package/src/en-GB.d.ts +17 -11
- package/src/en-GB.js +56 -41
- package/src/en-GH.d.ts +32 -3
- package/src/en-GH.js +104 -26
- package/src/en-IE.d.ts +17 -11
- package/src/en-IE.js +56 -41
- package/src/en-IN.d.ts +17 -11
- package/src/en-IN.js +60 -41
- package/src/en-KE.d.ts +28 -3
- package/src/en-KE.js +93 -26
- package/src/en-MY.d.ts +26 -3
- package/src/en-MY.js +91 -26
- package/src/en-NG.d.ts +17 -11
- package/src/en-NG.js +56 -41
- package/src/en-NZ.d.ts +32 -3
- package/src/en-NZ.js +85 -31
- package/src/en-PH.d.ts +32 -3
- package/src/en-PH.js +97 -26
- package/src/en-PK.d.ts +17 -11
- package/src/en-PK.js +60 -41
- package/src/en-SG.d.ts +28 -3
- package/src/en-SG.js +93 -26
- package/src/en-US.d.ts +36 -18
- package/src/en-US.js +70 -47
- package/src/en-ZA.d.ts +17 -11
- package/src/en-ZA.js +56 -41
- package/src/es-ES.d.ts +53 -21
- package/src/es-ES.js +104 -56
- package/src/es-MX.d.ts +53 -21
- package/src/es-MX.js +104 -56
- package/src/es-US.d.ts +53 -21
- package/src/es-US.js +92 -51
- package/src/fa-IR.d.ts +3 -5
- package/src/fa-IR.js +28 -13
- package/src/fi-FI.d.ts +3 -6
- package/src/fi-FI.js +47 -29
- package/src/fil-PH.d.ts +3 -5
- package/src/fil-PH.js +61 -28
- package/src/fr-BE.d.ts +31 -15
- package/src/fr-BE.js +128 -57
- package/src/fr-FR.d.ts +31 -16
- package/src/fr-FR.js +97 -60
- package/src/gu-IN.d.ts +3 -5
- package/src/gu-IN.js +31 -16
- package/src/ha-NG.d.ts +3 -5
- package/src/ha-NG.js +55 -27
- package/src/hbo-IL.d.ts +26 -12
- package/src/hbo-IL.js +92 -51
- package/src/he-IL.d.ts +17 -10
- package/src/he-IL.js +92 -50
- package/src/hi-IN.d.ts +3 -5
- package/src/hi-IN.js +30 -17
- package/src/hr-HR.d.ts +21 -10
- package/src/hr-HR.js +89 -33
- package/src/hu-HU.d.ts +3 -5
- package/src/hu-HU.js +57 -23
- package/src/id-ID.d.ts +3 -5
- package/src/id-ID.js +56 -23
- package/src/it-IT.d.ts +17 -11
- package/src/it-IT.js +74 -43
- package/src/ja-JP.d.ts +3 -6
- package/src/ja-JP.js +39 -26
- package/src/ka-GE.d.ts +3 -6
- package/src/ka-GE.js +38 -26
- package/src/kn-IN.d.ts +3 -5
- package/src/kn-IN.js +31 -16
- package/src/ko-KR.d.ts +3 -6
- package/src/ko-KR.js +34 -26
- package/src/lt-LT.d.ts +21 -11
- package/src/lt-LT.js +64 -42
- package/src/lv-LV.d.ts +21 -11
- package/src/lv-LV.js +79 -51
- package/src/mr-IN.d.ts +3 -5
- package/src/mr-IN.js +31 -16
- package/src/ms-MY.d.ts +3 -5
- package/src/ms-MY.js +58 -24
- package/src/nb-NO.d.ts +3 -6
- package/src/nb-NO.js +54 -34
- package/src/nl-NL.d.ts +41 -20
- package/src/nl-NL.js +111 -69
- package/src/pa-IN.d.ts +3 -5
- package/src/pa-IN.js +32 -16
- package/src/pl-PL.d.ts +21 -11
- package/src/pl-PL.js +69 -45
- package/src/pt-BR.d.ts +22 -11
- package/src/pt-BR.js +93 -53
- package/src/pt-PT.d.ts +17 -11
- package/src/pt-PT.js +80 -48
- package/src/ro-RO.d.ts +21 -11
- package/src/ro-RO.js +77 -39
- package/src/ru-RU.d.ts +35 -15
- package/src/ru-RU.js +100 -38
- package/src/sr-Cyrl-RS.d.ts +35 -15
- package/src/sr-Cyrl-RS.js +106 -43
- package/src/sr-Latn-RS.d.ts +35 -15
- package/src/sr-Latn-RS.js +106 -43
- package/src/sv-SE.d.ts +3 -6
- package/src/sv-SE.js +53 -34
- package/src/sw-KE.d.ts +3 -5
- package/src/sw-KE.js +50 -20
- package/src/ta-IN.d.ts +3 -5
- package/src/ta-IN.js +29 -17
- package/src/te-IN.d.ts +3 -5
- package/src/te-IN.js +31 -16
- package/src/th-TH.d.ts +3 -5
- package/src/th-TH.js +42 -19
- package/src/tr-TR.d.ts +17 -11
- package/src/tr-TR.js +63 -37
- package/src/uk-UA.d.ts +21 -10
- package/src/uk-UA.js +89 -33
- package/src/ur-PK.d.ts +3 -5
- package/src/ur-PK.js +32 -16
- package/src/utils/check-max.d.ts +26 -0
- package/src/utils/check-max.js +33 -0
- package/src/utils/expand-scientific.d.ts +0 -4
- package/src/utils/expand-scientific.js +7 -9
- package/src/utils/is-plain-object.d.ts +3 -4
- package/src/utils/is-plain-object.js +3 -4
- package/src/utils/parse-cardinal.d.ts +1 -2
- package/src/utils/parse-cardinal.js +12 -9
- package/src/utils/parse-currency.d.ts +1 -2
- package/src/utils/parse-currency.js +9 -11
- package/src/utils/parse-ordinal.d.ts +0 -1
- package/src/utils/parse-ordinal.js +9 -10
- package/src/utils/resolve-options.d.ts +17 -0
- package/src/utils/resolve-options.js +56 -0
- package/src/utils/scale.d.ts +49 -0
- package/src/utils/scale.js +65 -0
- package/src/vi-VN.d.ts +3 -6
- package/src/vi-VN.js +41 -28
- package/src/yo-NG.d.ts +3 -5
- package/src/yo-NG.js +49 -33
- package/src/zh-Hans-CN.d.ts +45 -20
- package/src/zh-Hans-CN.js +84 -31
- package/src/zh-Hant-TW.d.ts +45 -20
- package/src/zh-Hant-TW.js +85 -34
- package/src/utils/validate-options.d.ts +0 -8
- package/src/utils/validate-options.js +0 -16
package/src/zh-Hant-TW.d.ts
CHANGED
|
@@ -1,50 +1,75 @@
|
|
|
1
|
+
export const cardinalMax: bigint;
|
|
2
|
+
export const ordinalMax: bigint;
|
|
3
|
+
export const currencyMax: bigint;
|
|
4
|
+
/**
|
|
5
|
+
* @typedef {object} CardinalOptions
|
|
6
|
+
* @property {boolean} [formal] - Use formal/financial numerals
|
|
7
|
+
*/
|
|
8
|
+
/** @type {Required<CardinalOptions>} */
|
|
9
|
+
export const cardinalDefaults: Required<CardinalOptions>;
|
|
10
|
+
/**
|
|
11
|
+
* @typedef {object} OrdinalOptions
|
|
12
|
+
* @property {boolean} [formal] - Use formal/financial numerals
|
|
13
|
+
*/
|
|
14
|
+
/** @type {Required<OrdinalOptions>} */
|
|
15
|
+
export const ordinalDefaults: Required<OrdinalOptions>;
|
|
16
|
+
/**
|
|
17
|
+
* @typedef {object} CurrencyOptions
|
|
18
|
+
* @property {boolean} [formal] - Use formal/financial numerals
|
|
19
|
+
*/
|
|
20
|
+
/** @type {Required<CurrencyOptions>} */
|
|
21
|
+
export const currencyDefaults: Required<CurrencyOptions>;
|
|
22
|
+
export type CardinalOptions = {
|
|
23
|
+
/**
|
|
24
|
+
* - Use formal/financial numerals
|
|
25
|
+
*/
|
|
26
|
+
formal?: boolean | undefined;
|
|
27
|
+
};
|
|
28
|
+
export type OrdinalOptions = {
|
|
29
|
+
/**
|
|
30
|
+
* - Use formal/financial numerals
|
|
31
|
+
*/
|
|
32
|
+
formal?: boolean | undefined;
|
|
33
|
+
};
|
|
34
|
+
export type CurrencyOptions = {
|
|
35
|
+
/**
|
|
36
|
+
* - Use formal/financial numerals
|
|
37
|
+
*/
|
|
38
|
+
formal?: boolean | undefined;
|
|
39
|
+
};
|
|
1
40
|
/**
|
|
2
41
|
* Converts a numeric value to Traditional Chinese words.
|
|
3
|
-
*
|
|
4
42
|
* @param {number | string | bigint} value - The numeric value to convert
|
|
5
|
-
* @param {
|
|
6
|
-
* @param {boolean} [options.formal=true] - Use formal/financial numerals
|
|
43
|
+
* @param {CardinalOptions} [options] - Optional configuration
|
|
7
44
|
* @returns {string} The number in Traditional Chinese words
|
|
8
45
|
*/
|
|
9
|
-
export function toCardinal(value: number | string | bigint, options?:
|
|
10
|
-
formal?: boolean | undefined;
|
|
11
|
-
}): string;
|
|
46
|
+
export function toCardinal(value: number | string | bigint, options?: CardinalOptions): string;
|
|
12
47
|
/**
|
|
13
48
|
* Converts a numeric value to Traditional Chinese ordinal words.
|
|
14
|
-
*
|
|
15
49
|
* @param {number | string | bigint} value - The numeric value to convert (positive integer)
|
|
16
|
-
* @param {
|
|
17
|
-
* @param {boolean} [options.formal=true] - Use formal/financial numerals
|
|
50
|
+
* @param {OrdinalOptions} [options] - Optional configuration
|
|
18
51
|
* @returns {string} The number as ordinal words
|
|
19
52
|
* @throws {TypeError} If value is not a valid numeric type
|
|
20
53
|
* @throws {RangeError} If value is negative, zero, or has a decimal part
|
|
21
|
-
*
|
|
22
54
|
* @example
|
|
23
55
|
* toOrdinal(1) // '第壹'
|
|
24
56
|
* toOrdinal(2) // '第貳'
|
|
25
57
|
* toOrdinal(1, { formal: false }) // '第一'
|
|
26
58
|
*/
|
|
27
|
-
export function toOrdinal(value: number | string | bigint, options?:
|
|
28
|
-
formal?: boolean | undefined;
|
|
29
|
-
}): string;
|
|
59
|
+
export function toOrdinal(value: number | string | bigint, options?: OrdinalOptions): string;
|
|
30
60
|
/**
|
|
31
61
|
* Converts a numeric value to Traditional Chinese currency words (New Taiwan Dollar).
|
|
32
62
|
*
|
|
33
63
|
* Uses 圓 (yuan), 角 (jiao, 1/10), 分 (fen, 1/100).
|
|
34
64
|
* Formal writing adds 整 (zheng) for whole amounts.
|
|
35
|
-
*
|
|
36
65
|
* @param {number | string | bigint} value - The currency amount to convert
|
|
37
|
-
* @param {
|
|
38
|
-
* @param {boolean} [options.formal=true] - Use formal/financial numerals
|
|
66
|
+
* @param {CurrencyOptions} [options] - Optional configuration
|
|
39
67
|
* @returns {string} The amount in Traditional Chinese currency words
|
|
40
68
|
* @throws {TypeError} If value is not a valid numeric type
|
|
41
69
|
* @throws {Error} If value is not a valid number format
|
|
42
|
-
*
|
|
43
70
|
* @example
|
|
44
71
|
* toCurrency(42) // '肆拾貳圓整'
|
|
45
72
|
* toCurrency(1.50) // '壹圓伍角整'
|
|
46
73
|
* toCurrency(42, { formal: false }) // '四十二元整'
|
|
47
74
|
*/
|
|
48
|
-
export function toCurrency(value: number | string | bigint, options?:
|
|
49
|
-
formal?: boolean | undefined;
|
|
50
|
-
}): string;
|
|
75
|
+
export function toCurrency(value: number | string | bigint, options?: CurrencyOptions): string;
|
package/src/zh-Hant-TW.js
CHANGED
|
@@ -17,7 +17,9 @@
|
|
|
17
17
|
import { parseCardinalValue } from './utils/parse-cardinal.js'
|
|
18
18
|
import { parseCurrencyValue } from './utils/parse-currency.js'
|
|
19
19
|
import { parseOrdinalValue } from './utils/parse-ordinal.js'
|
|
20
|
-
import {
|
|
20
|
+
import { checkMax } from './utils/check-max.js'
|
|
21
|
+
import { bounded } from './utils/scale.js'
|
|
22
|
+
import { resolveOptions } from './utils/resolve-options.js'
|
|
21
23
|
|
|
22
24
|
// ============================================================================
|
|
23
25
|
// Vocabulary
|
|
@@ -39,6 +41,15 @@ const THOUSAND_FORMAL = '仟'
|
|
|
39
41
|
const WAN_WORD = '萬' // 10,000
|
|
40
42
|
const YI_WORD = '億' // 100,000,000
|
|
41
43
|
|
|
44
|
+
// Supported magnitude ceiling (checked at the public entry points). Numbers
|
|
45
|
+
// >= 億 (10^8) split into n / 10^8, which is then spelled by convertBelowYi —
|
|
46
|
+
// itself only valid below 億. So the ceiling is 億² = 10^16. Ordinal (第 +
|
|
47
|
+
// cardinal) and currency build on the cardinal, so they share it. Decimals are
|
|
48
|
+
// spelled digit-by-digit, so they have no ceiling.
|
|
49
|
+
export const cardinalMax = bounded(16)
|
|
50
|
+
export const ordinalMax = bounded(16)
|
|
51
|
+
export const currencyMax = bounded(16)
|
|
52
|
+
|
|
42
53
|
const ZERO = '零'
|
|
43
54
|
const NEGATIVE = '負'
|
|
44
55
|
const DECIMAL_SEP = '點'
|
|
@@ -66,7 +77,13 @@ const YUAN_COMMON = '元'
|
|
|
66
77
|
// Conversion Functions
|
|
67
78
|
// ============================================================================
|
|
68
79
|
|
|
69
|
-
|
|
80
|
+
/**
|
|
81
|
+
* Converts a non-negative integer to Traditional Chinese words.
|
|
82
|
+
* @param {bigint} n - The integer value to convert
|
|
83
|
+
* @param {boolean} [formal] - Use formal/financial numerals
|
|
84
|
+
* @returns {string} The integer in Traditional Chinese words
|
|
85
|
+
*/
|
|
86
|
+
function integerToWords(n, formal = true) {
|
|
70
87
|
if (n === 0n) return ZERO
|
|
71
88
|
|
|
72
89
|
const ones = formal ? ONES_FORMAL : ONES_COMMON
|
|
@@ -75,7 +92,11 @@ function integerToWords (n, formal = true) {
|
|
|
75
92
|
const thousand = formal ? THOUSAND_FORMAL : THOUSAND_COMMON
|
|
76
93
|
|
|
77
94
|
// Convert number below 萬 (10,000)
|
|
78
|
-
|
|
95
|
+
/**
|
|
96
|
+
* @param {bigint} value The number below 10,000 to convert
|
|
97
|
+
* @returns {string} The number in Traditional Chinese words
|
|
98
|
+
*/
|
|
99
|
+
function convertBelowWan(value) {
|
|
79
100
|
if (value === 0n) return ''
|
|
80
101
|
|
|
81
102
|
const parts = []
|
|
@@ -95,11 +116,11 @@ function integerToWords (n, formal = true) {
|
|
|
95
116
|
if (hundredsVal > 0n) {
|
|
96
117
|
if (needsZero) {
|
|
97
118
|
parts.push(ZERO)
|
|
98
|
-
needsZero = false
|
|
99
119
|
}
|
|
100
120
|
parts.push(ones[Number(hundredsVal)] + hundred)
|
|
101
121
|
needsZero = hundredsRemainder > 0n && hundredsRemainder < 10n
|
|
102
|
-
}
|
|
122
|
+
}
|
|
123
|
+
else if (thousandsVal > 0n && hundredsRemainder > 0n) {
|
|
103
124
|
needsZero = true
|
|
104
125
|
}
|
|
105
126
|
|
|
@@ -112,7 +133,8 @@ function integerToWords (n, formal = true) {
|
|
|
112
133
|
needsZero = false
|
|
113
134
|
}
|
|
114
135
|
parts.push(ones[Number(tensVal)] + ten)
|
|
115
|
-
}
|
|
136
|
+
}
|
|
137
|
+
else if ((hundredsVal > 0n || thousandsVal > 0n) && onesVal > 0n) {
|
|
116
138
|
needsZero = true
|
|
117
139
|
}
|
|
118
140
|
|
|
@@ -128,7 +150,11 @@ function integerToWords (n, formal = true) {
|
|
|
128
150
|
}
|
|
129
151
|
|
|
130
152
|
// Convert number below 億 (100 million)
|
|
131
|
-
|
|
153
|
+
/**
|
|
154
|
+
* @param {bigint} value The number below 100,000,000 to convert
|
|
155
|
+
* @returns {string} The number in Traditional Chinese words
|
|
156
|
+
*/
|
|
157
|
+
function convertBelowYi(value) {
|
|
132
158
|
if (value === 0n) return ''
|
|
133
159
|
|
|
134
160
|
const parts = []
|
|
@@ -148,7 +174,8 @@ function integerToWords (n, formal = true) {
|
|
|
148
174
|
}
|
|
149
175
|
parts.push(convertBelowWan(wanRemainder))
|
|
150
176
|
}
|
|
151
|
-
}
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
152
179
|
parts.push(convertBelowWan(value))
|
|
153
180
|
}
|
|
154
181
|
|
|
@@ -172,14 +199,21 @@ function integerToWords (n, formal = true) {
|
|
|
172
199
|
}
|
|
173
200
|
parts.push(convertBelowYi(yiRemainder))
|
|
174
201
|
}
|
|
175
|
-
}
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
176
204
|
parts.push(convertBelowYi(n))
|
|
177
205
|
}
|
|
178
206
|
|
|
179
207
|
return parts.join('')
|
|
180
208
|
}
|
|
181
209
|
|
|
182
|
-
|
|
210
|
+
/**
|
|
211
|
+
* Converts each digit of a decimal string to Traditional Chinese words.
|
|
212
|
+
* @param {string} decimalString - The decimal digits to convert
|
|
213
|
+
* @param {boolean} [formal] - Use formal/financial numerals
|
|
214
|
+
* @returns {string[]} The decimal digits as Traditional Chinese words
|
|
215
|
+
*/
|
|
216
|
+
function decimalDigitsToWords(decimalString, formal = true) {
|
|
183
217
|
const ones = formal ? ONES_FORMAL : ONES_COMMON
|
|
184
218
|
const words = []
|
|
185
219
|
for (const char of decimalString) {
|
|
@@ -188,20 +222,26 @@ function decimalDigitsToWords (decimalString, formal = true) {
|
|
|
188
222
|
return words
|
|
189
223
|
}
|
|
190
224
|
|
|
225
|
+
/**
|
|
226
|
+
* @typedef {object} CardinalOptions
|
|
227
|
+
* @property {boolean} [formal] - Use formal/financial numerals
|
|
228
|
+
*/
|
|
229
|
+
|
|
230
|
+
/** @type {Required<CardinalOptions>} */
|
|
231
|
+
export const cardinalDefaults = { formal: true }
|
|
232
|
+
|
|
191
233
|
/**
|
|
192
234
|
* Converts a numeric value to Traditional Chinese words.
|
|
193
|
-
*
|
|
194
235
|
* @param {number | string | bigint} value - The numeric value to convert
|
|
195
|
-
* @param {
|
|
196
|
-
* @param {boolean} [options.formal=true] - Use formal/financial numerals
|
|
236
|
+
* @param {CardinalOptions} [options] - Optional configuration
|
|
197
237
|
* @returns {string} The number in Traditional Chinese words
|
|
198
238
|
*/
|
|
199
|
-
function toCardinal
|
|
200
|
-
options = validateOptions(options)
|
|
239
|
+
function toCardinal(value, options) {
|
|
201
240
|
const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
|
|
241
|
+
checkMax(integerPart, cardinalMax)
|
|
202
242
|
|
|
203
243
|
// Apply option defaults
|
|
204
|
-
const { formal
|
|
244
|
+
const { formal } = resolveOptions(options, cardinalDefaults)
|
|
205
245
|
|
|
206
246
|
let result = ''
|
|
207
247
|
|
|
@@ -226,34 +266,38 @@ function toCardinal (value, options) {
|
|
|
226
266
|
* Converts a non-negative integer to Traditional Chinese ordinal words.
|
|
227
267
|
*
|
|
228
268
|
* Traditional Chinese ordinals use "第" prefix + cardinal number.
|
|
229
|
-
*
|
|
230
269
|
* @param {bigint} n - Positive integer to convert
|
|
231
270
|
* @param {boolean} formal - Use formal/financial numerals
|
|
232
271
|
* @returns {string} Traditional Chinese ordinal words
|
|
233
272
|
*/
|
|
234
|
-
function integerToOrdinal
|
|
273
|
+
function integerToOrdinal(n, formal = true) {
|
|
235
274
|
return ORDINAL_PREFIX + integerToWords(n, formal)
|
|
236
275
|
}
|
|
237
276
|
|
|
277
|
+
/**
|
|
278
|
+
* @typedef {object} OrdinalOptions
|
|
279
|
+
* @property {boolean} [formal] - Use formal/financial numerals
|
|
280
|
+
*/
|
|
281
|
+
|
|
282
|
+
/** @type {Required<OrdinalOptions>} */
|
|
283
|
+
export const ordinalDefaults = { formal: true }
|
|
284
|
+
|
|
238
285
|
/**
|
|
239
286
|
* Converts a numeric value to Traditional Chinese ordinal words.
|
|
240
|
-
*
|
|
241
287
|
* @param {number | string | bigint} value - The numeric value to convert (positive integer)
|
|
242
|
-
* @param {
|
|
243
|
-
* @param {boolean} [options.formal=true] - Use formal/financial numerals
|
|
288
|
+
* @param {OrdinalOptions} [options] - Optional configuration
|
|
244
289
|
* @returns {string} The number as ordinal words
|
|
245
290
|
* @throws {TypeError} If value is not a valid numeric type
|
|
246
291
|
* @throws {RangeError} If value is negative, zero, or has a decimal part
|
|
247
|
-
*
|
|
248
292
|
* @example
|
|
249
293
|
* toOrdinal(1) // '第壹'
|
|
250
294
|
* toOrdinal(2) // '第貳'
|
|
251
295
|
* toOrdinal(1, { formal: false }) // '第一'
|
|
252
296
|
*/
|
|
253
|
-
function toOrdinal
|
|
254
|
-
options = validateOptions(options)
|
|
297
|
+
function toOrdinal(value, options) {
|
|
255
298
|
const integerPart = parseOrdinalValue(value)
|
|
256
|
-
|
|
299
|
+
checkMax(integerPart, ordinalMax)
|
|
300
|
+
const { formal } = resolveOptions(options, ordinalDefaults)
|
|
257
301
|
return integerToOrdinal(integerPart, formal)
|
|
258
302
|
}
|
|
259
303
|
|
|
@@ -261,28 +305,33 @@ function toOrdinal (value, options) {
|
|
|
261
305
|
// CURRENCY: toCurrency(value, options?)
|
|
262
306
|
// ============================================================================
|
|
263
307
|
|
|
308
|
+
/**
|
|
309
|
+
* @typedef {object} CurrencyOptions
|
|
310
|
+
* @property {boolean} [formal] - Use formal/financial numerals
|
|
311
|
+
*/
|
|
312
|
+
|
|
313
|
+
/** @type {Required<CurrencyOptions>} */
|
|
314
|
+
export const currencyDefaults = { formal: true }
|
|
315
|
+
|
|
264
316
|
/**
|
|
265
317
|
* Converts a numeric value to Traditional Chinese currency words (New Taiwan Dollar).
|
|
266
318
|
*
|
|
267
319
|
* Uses 圓 (yuan), 角 (jiao, 1/10), 分 (fen, 1/100).
|
|
268
320
|
* Formal writing adds 整 (zheng) for whole amounts.
|
|
269
|
-
*
|
|
270
321
|
* @param {number | string | bigint} value - The currency amount to convert
|
|
271
|
-
* @param {
|
|
272
|
-
* @param {boolean} [options.formal=true] - Use formal/financial numerals
|
|
322
|
+
* @param {CurrencyOptions} [options] - Optional configuration
|
|
273
323
|
* @returns {string} The amount in Traditional Chinese currency words
|
|
274
324
|
* @throws {TypeError} If value is not a valid numeric type
|
|
275
325
|
* @throws {Error} If value is not a valid number format
|
|
276
|
-
*
|
|
277
326
|
* @example
|
|
278
327
|
* toCurrency(42) // '肆拾貳圓整'
|
|
279
328
|
* toCurrency(1.50) // '壹圓伍角整'
|
|
280
329
|
* toCurrency(42, { formal: false }) // '四十二元整'
|
|
281
330
|
*/
|
|
282
|
-
function toCurrency
|
|
283
|
-
options = validateOptions(options)
|
|
331
|
+
function toCurrency(value, options) {
|
|
284
332
|
const { isNegative, dollars: yuan, cents } = parseCurrencyValue(value)
|
|
285
|
-
|
|
333
|
+
checkMax(yuan, currencyMax)
|
|
334
|
+
const { formal } = resolveOptions(options, currencyDefaults)
|
|
286
335
|
|
|
287
336
|
const yuanWord = formal ? YUAN_FORMAL : YUAN_COMMON
|
|
288
337
|
|
|
@@ -315,10 +364,12 @@ function toCurrency (value, options) {
|
|
|
315
364
|
result += ZERO
|
|
316
365
|
}
|
|
317
366
|
result += ones[Number(fen)] + FEN_FORMAL
|
|
318
|
-
}
|
|
367
|
+
}
|
|
368
|
+
else if (jiao > 0n) {
|
|
319
369
|
// Has jiao but no fen - add 整
|
|
320
370
|
result += ZHENG_FORMAL
|
|
321
|
-
}
|
|
371
|
+
}
|
|
372
|
+
else {
|
|
322
373
|
// Whole yuan only - add 整
|
|
323
374
|
result += ZHENG_FORMAL
|
|
324
375
|
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Validates and normalizes the options parameter.
|
|
3
|
-
*
|
|
4
|
-
* @param {*} options The options value to validate
|
|
5
|
-
* @returns {Object} A valid options object (empty object if undefined)
|
|
6
|
-
* @throws {TypeError} If options is not undefined or a plain object
|
|
7
|
-
*/
|
|
8
|
-
export function validateOptions(options: any): Object;
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { isPlainObject } from './is-plain-object.js'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Validates and normalizes the options parameter.
|
|
5
|
-
*
|
|
6
|
-
* @param {*} options The options value to validate
|
|
7
|
-
* @returns {Object} A valid options object (empty object if undefined)
|
|
8
|
-
* @throws {TypeError} If options is not undefined or a plain object
|
|
9
|
-
*/
|
|
10
|
-
export function validateOptions (options) {
|
|
11
|
-
if (options === undefined) return {}
|
|
12
|
-
if (isPlainObject(options)) return options
|
|
13
|
-
throw new TypeError(
|
|
14
|
-
`Invalid options: expected plain object or undefined, got ${typeof options}`
|
|
15
|
-
)
|
|
16
|
-
}
|