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.
@@ -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,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;