ya-kansuji 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/LICENSE +21 -0
- package/README.md +169 -0
- package/dist/index.cjs +401 -0
- package/dist/index.d.cts +148 -0
- package/dist/index.d.ts +148 -0
- package/dist/index.iife.min.js +3 -0
- package/dist/index.js +389 -0
- package/package.json +69 -0
- package/src/constants.ts +16 -0
- package/src/formatter/gov.ts +21 -0
- package/src/formatter/judic.ts +42 -0
- package/src/formatter/lawyer.ts +22 -0
- package/src/formatter/simple.ts +30 -0
- package/src/formatters.ts +88 -0
- package/src/groups.ts +31 -0
- package/src/index.ts +13 -0
- package/src/parse.ts +136 -0
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
//#region src/parse.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* 漢数字・大字・全角数字が混じったテキストを bigint に変換する。
|
|
4
|
+
*
|
|
5
|
+
* 照合前にカンマ・読点・各種空白などの区切り文字を除去し、先頭から連続してマッチする
|
|
6
|
+
* 数値表現だけを読み取る(例: `toBigInt('五x六')` は `5n`)。マッチしなければ `0n` を返す。
|
|
7
|
+
* 先頭の「マイナス」は負号として扱うが、ASCII の `-` や U+2212(−)は負号として扱わない。
|
|
8
|
+
* 値の上限はなく、無量大数(10^68)を超える大きさもそのまま扱える。
|
|
9
|
+
*
|
|
10
|
+
* @param str 変換対象の文字列
|
|
11
|
+
* @returns テキストが表す整数値
|
|
12
|
+
* @example
|
|
13
|
+
* toBigInt('一〇二四') // => 1024n
|
|
14
|
+
* toBigInt('マイナス千二百') // => -1200n
|
|
15
|
+
* toBigInt('一無量大数') // => 10n ** 68n
|
|
16
|
+
*/
|
|
17
|
+
declare function toBigInt(str: string): bigint;
|
|
18
|
+
/**
|
|
19
|
+
* {@link toBigInt} と同じ規則でテキストを解釈し、`number` として返す。
|
|
20
|
+
*
|
|
21
|
+
* 結果の絶対値が `Number.MAX_SAFE_INTEGER`(2^53 − 1)を超える場合は `RangeError` を
|
|
22
|
+
* 投げる。安全整数を超えうる値を扱うときは {@link toBigInt} を使うこと。
|
|
23
|
+
*
|
|
24
|
+
* @param str 変換対象の文字列
|
|
25
|
+
* @returns テキストが表す数値
|
|
26
|
+
* @throws {RangeError} 値が安全整数の範囲を超える場合
|
|
27
|
+
* @example
|
|
28
|
+
* toNumber('一〇二四') // => 1024
|
|
29
|
+
* toNumber('一無量大数') // throws RangeError
|
|
30
|
+
*/
|
|
31
|
+
declare function toNumber(str: string): number;
|
|
32
|
+
//#endregion
|
|
33
|
+
//#region src/constants.d.ts
|
|
34
|
+
/** 10^1〜10^3 の位を表す漢数字の単位(十・百・千)。 */
|
|
35
|
+
declare const UNIT_EXP3: readonly ['十', '百', '千'];
|
|
36
|
+
/** 10^4 ごとに繰り上がる漢数字の単位(万・億・兆…無量大数)。 */
|
|
37
|
+
declare const UNIT_EXP4: readonly ['万', '億', '兆', '京', '垓', '𥝱', '穣', '溝', '澗', '正', '載', '極', '恒河沙', '阿僧祇', '那由他', '不可思議', '無量大数'];
|
|
38
|
+
//#endregion
|
|
39
|
+
//#region src/formatters.d.ts
|
|
40
|
+
/** フォーマッタに渡す任意のオプション。ビルトインフォーマッタは参照しない。 */
|
|
41
|
+
type KansujiFormatterOptions = Record<string, unknown>;
|
|
42
|
+
/**
|
|
43
|
+
* 非負の bigint を文字列へ整形する関数。{@link toKan} は負数の符号処理を済ませたうえで
|
|
44
|
+
* 常に 0 以上の値を渡す。
|
|
45
|
+
*/
|
|
46
|
+
type KansujiFormatter = (num: bigint, options?: KansujiFormatterOptions) => string;
|
|
47
|
+
/**
|
|
48
|
+
* フォーマッタを名前付きで登録する。既存の同名フォーマッタ(ビルトイン含む)は警告なく
|
|
49
|
+
* 上書きされる。
|
|
50
|
+
*
|
|
51
|
+
* レジストリは ESM 版と CJS 版で共有されない。登録側と利用側は同じモジュール形式
|
|
52
|
+
* (`import` または `require`) で `ya-kansuji` を読み込むこと。
|
|
53
|
+
*
|
|
54
|
+
* @param name フォーマッタ名。{@link toKan} の第2引数に渡して選択する
|
|
55
|
+
* @param formatter `(num: bigint, options?) => string`。`num` は常に 0 以上
|
|
56
|
+
* @throws {TypeError} `formatter` が関数でない場合
|
|
57
|
+
*/
|
|
58
|
+
declare function registerFormatter(name: string, formatter: KansujiFormatter): void;
|
|
59
|
+
/**
|
|
60
|
+
* 登録済みフォーマッタを名前で取得する。未登録なら `undefined`。
|
|
61
|
+
*
|
|
62
|
+
* @param name フォーマッタ名
|
|
63
|
+
* @returns フォーマッタ関数、なければ `undefined`
|
|
64
|
+
*/
|
|
65
|
+
declare function getFormatter(name: string): KansujiFormatter | undefined;
|
|
66
|
+
/**
|
|
67
|
+
* 数値を漢数字・漢字混じりの文字列へ整形する。
|
|
68
|
+
*
|
|
69
|
+
* 負数は先頭に「マイナス」を付け、絶対値をフォーマッタに渡す(フォーマッタが受け取るのは
|
|
70
|
+
* 常に非負値)。`number` は安全整数でなければならず、より大きな値は `bigint` で渡すこと。
|
|
71
|
+
* ビルトインフォーマッタが表現できるのは絶対値 `10^72 − 1` まで。
|
|
72
|
+
*
|
|
73
|
+
* @param num 変換対象。`number`(安全整数)または `bigint`
|
|
74
|
+
* @param formatter フォーマッタ名、またはフォーマッタ関数。既定は `'simple'`
|
|
75
|
+
* @param options フォーマッタへ渡すオプション(ビルトインは未使用)
|
|
76
|
+
* @returns 整形後の文字列
|
|
77
|
+
* @throws {RangeError} `num` が非整数、安全整数を超える `number`、またはビルトイン
|
|
78
|
+
* フォーマッタの表現範囲を超える場合
|
|
79
|
+
* @throws {TypeError} 指定した名前のフォーマッタが見つからない場合
|
|
80
|
+
* @example
|
|
81
|
+
* toKan(12345) // => '一万二千三百四十五'
|
|
82
|
+
* toKan(12340005, 'gov') // => '1234万, 5'
|
|
83
|
+
* toKan(-1234) // => 'マイナス千二百三十四'
|
|
84
|
+
*/
|
|
85
|
+
declare function toKan(num: number | bigint, formatter?: string | KansujiFormatter, options?: KansujiFormatterOptions): string;
|
|
86
|
+
//#endregion
|
|
87
|
+
//#region src/formatter/simple.d.ts
|
|
88
|
+
/**
|
|
89
|
+
* 標準的な漢数字へ整形する(位ごとに漢数字の単位を使う)。
|
|
90
|
+
*
|
|
91
|
+
* @param num 0 以上 `10^72 − 1` 以下の bigint
|
|
92
|
+
* @returns 漢数字文字列。`0n` は `'零'`
|
|
93
|
+
* @throws {RangeError} 範囲外の値の場合。負数の整形には {@link toKan} を使う
|
|
94
|
+
* @example
|
|
95
|
+
* simple(12345n) // => '一万二千三百四十五'
|
|
96
|
+
* simple(10003n) // => '一万三'
|
|
97
|
+
*/
|
|
98
|
+
declare function simple(num: bigint): string;
|
|
99
|
+
//#endregion
|
|
100
|
+
//#region src/formatter/gov.d.ts
|
|
101
|
+
/**
|
|
102
|
+
* 「公用文作成の要領」方式で整形する(4桁ごとにアラビア数字+漢字単位、読点区切り)。
|
|
103
|
+
*
|
|
104
|
+
* @param num 0 以上 `10^72 − 1` 以下の bigint
|
|
105
|
+
* @returns 整形後の文字列。`0n` は `'0'`
|
|
106
|
+
* @throws {RangeError} 範囲外の値の場合。負数の整形には {@link toKan} を使う
|
|
107
|
+
* @example
|
|
108
|
+
* gov(12340005n) // => '1234万, 5'
|
|
109
|
+
* gov(10003n) // => '1万, 3'
|
|
110
|
+
*/
|
|
111
|
+
declare function gov(num: bigint): string;
|
|
112
|
+
//#endregion
|
|
113
|
+
//#region src/formatter/lawyer.d.ts
|
|
114
|
+
/**
|
|
115
|
+
* 行政・司法で用いられる方式で整形する(4桁ごとにアラビア数字+漢字単位、千の位にカンマ)。
|
|
116
|
+
*
|
|
117
|
+
* @param num 0 以上 `10^72 − 1` 以下の bigint
|
|
118
|
+
* @returns 整形後の文字列。`0n` は `'0'`
|
|
119
|
+
* @throws {RangeError} 範囲外の値の場合。負数の整形には {@link toKan} を使う
|
|
120
|
+
* @example
|
|
121
|
+
* lawyer(12340005n) // => '1,234万5'
|
|
122
|
+
* lawyer(10003n) // => '1万3'
|
|
123
|
+
*/
|
|
124
|
+
declare function lawyer(num: bigint): string;
|
|
125
|
+
//#endregion
|
|
126
|
+
//#region src/formatter/judic.d.ts
|
|
127
|
+
/**
|
|
128
|
+
* 裁判判例の縦書き方式で整形する(4桁ごとに漢数字、下位グループはゼロ埋め、単位は漢字)。
|
|
129
|
+
*
|
|
130
|
+
* @param num 0 以上 `10^72 − 1` 以下の bigint
|
|
131
|
+
* @returns 整形後の文字列。`0n` は `'〇'`
|
|
132
|
+
* @throws {RangeError} 範囲外の値の場合。負数の整形には {@link toKan} を使う
|
|
133
|
+
* @example
|
|
134
|
+
* judicV(12340005n) // => '一二三四万〇〇〇五'
|
|
135
|
+
*/
|
|
136
|
+
declare function judicV(num: bigint): string;
|
|
137
|
+
/**
|
|
138
|
+
* 最高裁判例の横書き方式で整形する(4桁ごとに全角数字、下位グループはゼロ埋め)。
|
|
139
|
+
*
|
|
140
|
+
* @param num 0 以上 `10^72 − 1` 以下の bigint
|
|
141
|
+
* @returns 整形後の文字列。`0n` は `'0'`
|
|
142
|
+
* @throws {RangeError} 範囲外の値の場合。負数の整形には {@link toKan} を使う
|
|
143
|
+
* @example
|
|
144
|
+
* judicH(12340005n) // => '1234万0005'
|
|
145
|
+
*/
|
|
146
|
+
declare function judicH(num: bigint): string;
|
|
147
|
+
//#endregion
|
|
148
|
+
export { type KansujiFormatter, type KansujiFormatterOptions, UNIT_EXP3, UNIT_EXP4, getFormatter, gov, judicH, judicV, lawyer, registerFormatter, simple, toBigInt, toKan, toNumber };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
//#region src/parse.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* 漢数字・大字・全角数字が混じったテキストを bigint に変換する。
|
|
4
|
+
*
|
|
5
|
+
* 照合前にカンマ・読点・各種空白などの区切り文字を除去し、先頭から連続してマッチする
|
|
6
|
+
* 数値表現だけを読み取る(例: `toBigInt('五x六')` は `5n`)。マッチしなければ `0n` を返す。
|
|
7
|
+
* 先頭の「マイナス」は負号として扱うが、ASCII の `-` や U+2212(−)は負号として扱わない。
|
|
8
|
+
* 値の上限はなく、無量大数(10^68)を超える大きさもそのまま扱える。
|
|
9
|
+
*
|
|
10
|
+
* @param str 変換対象の文字列
|
|
11
|
+
* @returns テキストが表す整数値
|
|
12
|
+
* @example
|
|
13
|
+
* toBigInt('一〇二四') // => 1024n
|
|
14
|
+
* toBigInt('マイナス千二百') // => -1200n
|
|
15
|
+
* toBigInt('一無量大数') // => 10n ** 68n
|
|
16
|
+
*/
|
|
17
|
+
declare function toBigInt(str: string): bigint;
|
|
18
|
+
/**
|
|
19
|
+
* {@link toBigInt} と同じ規則でテキストを解釈し、`number` として返す。
|
|
20
|
+
*
|
|
21
|
+
* 結果の絶対値が `Number.MAX_SAFE_INTEGER`(2^53 − 1)を超える場合は `RangeError` を
|
|
22
|
+
* 投げる。安全整数を超えうる値を扱うときは {@link toBigInt} を使うこと。
|
|
23
|
+
*
|
|
24
|
+
* @param str 変換対象の文字列
|
|
25
|
+
* @returns テキストが表す数値
|
|
26
|
+
* @throws {RangeError} 値が安全整数の範囲を超える場合
|
|
27
|
+
* @example
|
|
28
|
+
* toNumber('一〇二四') // => 1024
|
|
29
|
+
* toNumber('一無量大数') // throws RangeError
|
|
30
|
+
*/
|
|
31
|
+
declare function toNumber(str: string): number;
|
|
32
|
+
//#endregion
|
|
33
|
+
//#region src/constants.d.ts
|
|
34
|
+
/** 10^1〜10^3 の位を表す漢数字の単位(十・百・千)。 */
|
|
35
|
+
declare const UNIT_EXP3: readonly ['十', '百', '千'];
|
|
36
|
+
/** 10^4 ごとに繰り上がる漢数字の単位(万・億・兆…無量大数)。 */
|
|
37
|
+
declare const UNIT_EXP4: readonly ['万', '億', '兆', '京', '垓', '𥝱', '穣', '溝', '澗', '正', '載', '極', '恒河沙', '阿僧祇', '那由他', '不可思議', '無量大数'];
|
|
38
|
+
//#endregion
|
|
39
|
+
//#region src/formatters.d.ts
|
|
40
|
+
/** フォーマッタに渡す任意のオプション。ビルトインフォーマッタは参照しない。 */
|
|
41
|
+
type KansujiFormatterOptions = Record<string, unknown>;
|
|
42
|
+
/**
|
|
43
|
+
* 非負の bigint を文字列へ整形する関数。{@link toKan} は負数の符号処理を済ませたうえで
|
|
44
|
+
* 常に 0 以上の値を渡す。
|
|
45
|
+
*/
|
|
46
|
+
type KansujiFormatter = (num: bigint, options?: KansujiFormatterOptions) => string;
|
|
47
|
+
/**
|
|
48
|
+
* フォーマッタを名前付きで登録する。既存の同名フォーマッタ(ビルトイン含む)は警告なく
|
|
49
|
+
* 上書きされる。
|
|
50
|
+
*
|
|
51
|
+
* レジストリは ESM 版と CJS 版で共有されない。登録側と利用側は同じモジュール形式
|
|
52
|
+
* (`import` または `require`) で `ya-kansuji` を読み込むこと。
|
|
53
|
+
*
|
|
54
|
+
* @param name フォーマッタ名。{@link toKan} の第2引数に渡して選択する
|
|
55
|
+
* @param formatter `(num: bigint, options?) => string`。`num` は常に 0 以上
|
|
56
|
+
* @throws {TypeError} `formatter` が関数でない場合
|
|
57
|
+
*/
|
|
58
|
+
declare function registerFormatter(name: string, formatter: KansujiFormatter): void;
|
|
59
|
+
/**
|
|
60
|
+
* 登録済みフォーマッタを名前で取得する。未登録なら `undefined`。
|
|
61
|
+
*
|
|
62
|
+
* @param name フォーマッタ名
|
|
63
|
+
* @returns フォーマッタ関数、なければ `undefined`
|
|
64
|
+
*/
|
|
65
|
+
declare function getFormatter(name: string): KansujiFormatter | undefined;
|
|
66
|
+
/**
|
|
67
|
+
* 数値を漢数字・漢字混じりの文字列へ整形する。
|
|
68
|
+
*
|
|
69
|
+
* 負数は先頭に「マイナス」を付け、絶対値をフォーマッタに渡す(フォーマッタが受け取るのは
|
|
70
|
+
* 常に非負値)。`number` は安全整数でなければならず、より大きな値は `bigint` で渡すこと。
|
|
71
|
+
* ビルトインフォーマッタが表現できるのは絶対値 `10^72 − 1` まで。
|
|
72
|
+
*
|
|
73
|
+
* @param num 変換対象。`number`(安全整数)または `bigint`
|
|
74
|
+
* @param formatter フォーマッタ名、またはフォーマッタ関数。既定は `'simple'`
|
|
75
|
+
* @param options フォーマッタへ渡すオプション(ビルトインは未使用)
|
|
76
|
+
* @returns 整形後の文字列
|
|
77
|
+
* @throws {RangeError} `num` が非整数、安全整数を超える `number`、またはビルトイン
|
|
78
|
+
* フォーマッタの表現範囲を超える場合
|
|
79
|
+
* @throws {TypeError} 指定した名前のフォーマッタが見つからない場合
|
|
80
|
+
* @example
|
|
81
|
+
* toKan(12345) // => '一万二千三百四十五'
|
|
82
|
+
* toKan(12340005, 'gov') // => '1234万, 5'
|
|
83
|
+
* toKan(-1234) // => 'マイナス千二百三十四'
|
|
84
|
+
*/
|
|
85
|
+
declare function toKan(num: number | bigint, formatter?: string | KansujiFormatter, options?: KansujiFormatterOptions): string;
|
|
86
|
+
//#endregion
|
|
87
|
+
//#region src/formatter/simple.d.ts
|
|
88
|
+
/**
|
|
89
|
+
* 標準的な漢数字へ整形する(位ごとに漢数字の単位を使う)。
|
|
90
|
+
*
|
|
91
|
+
* @param num 0 以上 `10^72 − 1` 以下の bigint
|
|
92
|
+
* @returns 漢数字文字列。`0n` は `'零'`
|
|
93
|
+
* @throws {RangeError} 範囲外の値の場合。負数の整形には {@link toKan} を使う
|
|
94
|
+
* @example
|
|
95
|
+
* simple(12345n) // => '一万二千三百四十五'
|
|
96
|
+
* simple(10003n) // => '一万三'
|
|
97
|
+
*/
|
|
98
|
+
declare function simple(num: bigint): string;
|
|
99
|
+
//#endregion
|
|
100
|
+
//#region src/formatter/gov.d.ts
|
|
101
|
+
/**
|
|
102
|
+
* 「公用文作成の要領」方式で整形する(4桁ごとにアラビア数字+漢字単位、読点区切り)。
|
|
103
|
+
*
|
|
104
|
+
* @param num 0 以上 `10^72 − 1` 以下の bigint
|
|
105
|
+
* @returns 整形後の文字列。`0n` は `'0'`
|
|
106
|
+
* @throws {RangeError} 範囲外の値の場合。負数の整形には {@link toKan} を使う
|
|
107
|
+
* @example
|
|
108
|
+
* gov(12340005n) // => '1234万, 5'
|
|
109
|
+
* gov(10003n) // => '1万, 3'
|
|
110
|
+
*/
|
|
111
|
+
declare function gov(num: bigint): string;
|
|
112
|
+
//#endregion
|
|
113
|
+
//#region src/formatter/lawyer.d.ts
|
|
114
|
+
/**
|
|
115
|
+
* 行政・司法で用いられる方式で整形する(4桁ごとにアラビア数字+漢字単位、千の位にカンマ)。
|
|
116
|
+
*
|
|
117
|
+
* @param num 0 以上 `10^72 − 1` 以下の bigint
|
|
118
|
+
* @returns 整形後の文字列。`0n` は `'0'`
|
|
119
|
+
* @throws {RangeError} 範囲外の値の場合。負数の整形には {@link toKan} を使う
|
|
120
|
+
* @example
|
|
121
|
+
* lawyer(12340005n) // => '1,234万5'
|
|
122
|
+
* lawyer(10003n) // => '1万3'
|
|
123
|
+
*/
|
|
124
|
+
declare function lawyer(num: bigint): string;
|
|
125
|
+
//#endregion
|
|
126
|
+
//#region src/formatter/judic.d.ts
|
|
127
|
+
/**
|
|
128
|
+
* 裁判判例の縦書き方式で整形する(4桁ごとに漢数字、下位グループはゼロ埋め、単位は漢字)。
|
|
129
|
+
*
|
|
130
|
+
* @param num 0 以上 `10^72 − 1` 以下の bigint
|
|
131
|
+
* @returns 整形後の文字列。`0n` は `'〇'`
|
|
132
|
+
* @throws {RangeError} 範囲外の値の場合。負数の整形には {@link toKan} を使う
|
|
133
|
+
* @example
|
|
134
|
+
* judicV(12340005n) // => '一二三四万〇〇〇五'
|
|
135
|
+
*/
|
|
136
|
+
declare function judicV(num: bigint): string;
|
|
137
|
+
/**
|
|
138
|
+
* 最高裁判例の横書き方式で整形する(4桁ごとに全角数字、下位グループはゼロ埋め)。
|
|
139
|
+
*
|
|
140
|
+
* @param num 0 以上 `10^72 − 1` 以下の bigint
|
|
141
|
+
* @returns 整形後の文字列。`0n` は `'0'`
|
|
142
|
+
* @throws {RangeError} 範囲外の値の場合。負数の整形には {@link toKan} を使う
|
|
143
|
+
* @example
|
|
144
|
+
* judicH(12340005n) // => '1234万0005'
|
|
145
|
+
*/
|
|
146
|
+
declare function judicH(num: bigint): string;
|
|
147
|
+
//#endregion
|
|
148
|
+
export { type KansujiFormatter, type KansujiFormatterOptions, UNIT_EXP3, UNIT_EXP4, getFormatter, gov, judicH, judicV, lawyer, registerFormatter, simple, toBigInt, toKan, toNumber };
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
var YaKansuji=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});let t=[`十`,`百`,`千`],n=[`万`,`億`,`兆`,`京`,`垓`,`𥝱`,`穣`,`溝`,`澗`,`正`,`載`,`極`,`恒河沙`,`阿僧祇`,`那由他`,`不可思議`,`無量大数`],r=`〇一二三四五六七八九`,i=`${r}0123456789零壱壹弌弐貳貮参參弎肆伍陸漆質柒捌玖拾什陌佰阡仟萬秭`,a=Array.from(i),o=Array.from(`01234567890123456789011122233345677789十十百百千千万𥝱`),s=new Map(a.map((e,t)=>[e,o[t]])),c=new Set(`,.,.、. .
|
|
2
|
+
.\v.\f.\r. .\xA0. . . . . . . . . . . . .\u2028.\u2029. . . .`.split(`.`)),l=[0n,1n,2n,3n,4n,5n,6n,7n,8n,9n],u=new Map([[`卄`,20n],[`廿`,20n],[`卅`,30n],[`丗`,30n],[`卌`,40n],[`皕`,200n]]),d=[...t,...n.filter(e=>Array.from(e).length===1)],f=n.filter(e=>Array.from(e).length>1),p=[...new Set([...a,...o,...d,...u.keys()])].join(``),m=`${f.join(`|`)}|[${p}]`,h=RegExp(`(?:マイナス)?(?:${m})+`,`u`),g=new RegExp(m,`gu`);function _(e,t){let n=t;return new Map(e.map(e=>{let r=[e,n];return n*=t,r}))}let v=_(t,10n),y=_(n,10000n),b=BigInt(2**53-1);function x(e){let t=``;for(let n of e){let e=s.get(n)??n;c.has(e)||(t+=e)}return t}function S(e){let t=x(String(e)),n=h.exec(t);if(!n)return 0n;let r=n[0];if(r===void 0)return 0n;let i=0n,a=0n,o=null;for(let e of r.match(g)??[])if(e>=`1`&&e<=`9`){let t=l[e.charCodeAt(0)-48];o=(o??0n)*10n+t}else if(e===`0`)o!==null&&(o*=10n);else{let t=u.get(e);if(t!==void 0)i+=t,o=null;else{let t=y.get(e);if(t!==void 0)o!==null&&(i+=o,o=null),i===0n&&(i=1n),a+=i*t,i=0n;else{let t=v.get(e);t!==void 0&&(o??=1n,i+=o*t,o=null)}}}o!==null&&(i+=o);let s=a+i;return r.startsWith(`マイナス`)?-s:s}function C(e){let t=S(e);if(t>b||t<-b)throw RangeError(`kansuji value exceeds Number.MAX_SAFE_INTEGER: ${e}`);return Number(t)}let w=10000n,T=[``,...n],E=T.length,D=w**BigInt(E),O=E*4;function k(e){if(e<0n||e>=D)throw RangeError(`Kansuji formatters require a bigint between 0 and 10^${O} - 1`);let t=[],n=e,r=0;do{let e=T[r];if(e===void 0)throw RangeError(`Kansuji formatters require a bigint between 0 and 10^${O} - 1`);t.push([Number(n%w),e]),n/=w,r++}while(n>0n);return t.reverse()}function A(e){if(e===0n)return`0`;let t=[];for(let[n,r]of k(e))n!==0&&t.push(`${n}${r}`);return t.join(`, `)}function j(e,t,n){if(e===0n)return t;let r=``,i=!0;for(let[t,n]of k(e))t!==0&&(r+=(i?String(t):String(t).padStart(4,`0`))+n,i=!1);return n(r)}function M(e){return j(e,`〇`,e=>e.replace(/[0-9]/g,e=>r.charAt(Number(e))))}function N(e){return j(e,`0`,e=>e.replace(/[0-9]/g,e=>String.fromCharCode(e.charCodeAt(0)+65248)))}function P(e){if(e===0n)return`0`;let t=``;for(let[n,r]of k(e)){if(n===0)continue;let e=String(n);t+=(n>=1e3?`${e[0]},${e.slice(1)}`:e)+r}return t}let F=[1,10,100,1e3];function I(e){if(e===0n)return`零`;let n=``;for(let[i,a]of k(e))if(i!==0){for(let e=t.length;e>=0;e--){let a=t[e-1]??``,o=Math.floor(i/(F[e]??1))%10;o!==0&&(n+=o===1&&a!==``?a:r.charAt(o)+a)}n+=a}return n}let L=new Map([[`simple`,I],[`gov`,A],[`lawyer`,P],[`judic_v`,M],[`judic_h`,N]]);function R(e,t){if(typeof t!=`function`)throw TypeError(`Registering invalid formatter.`);L.set(e,t)}function z(e){return L.get(e)}function B(e,t=`simple`,n={}){let r;if(typeof e==`bigint`)r=e;else if(Number.isSafeInteger(e))r=BigInt(e);else throw RangeError(`toKan requires a safe integer or bigint: ${e}`);if(r<0n)return`マイナス${B(-r,t,n)}`;let i=typeof t==`function`?t:L.get(t);if(!i)throw TypeError(`Unable to find formatter ${String(t)}`);return i(r,n)}return e.UNIT_EXP3=t,e.UNIT_EXP4=n,e.getFormatter=z,e.gov=A,e.judicH=N,e.judicV=M,e.lawyer=P,e.registerFormatter=R,e.simple=I,e.toBigInt=S,e.toKan=B,e.toNumber=C,e})({});
|
|
3
|
+
globalThis.YaKansuji = YaKansuji;
|