@digitalwalletcorp/utils 0.1.0 → 0.4.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.
Files changed (104) hide show
  1. package/README.md +13 -12
  2. package/lib/crypto-util-DFJqfmuw.js +46 -0
  3. package/lib/crypto-util-DFJqfmuw.js.map +1 -0
  4. package/lib/crypto-util-DeZSGetI.cjs +2 -0
  5. package/lib/crypto-util-DeZSGetI.cjs.map +1 -0
  6. package/lib/crypto-util.cjs +2 -0
  7. package/lib/crypto-util.cjs.map +1 -0
  8. package/lib/crypto-util.d.cts +28 -0
  9. package/lib/crypto-util.d.ts +28 -0
  10. package/lib/crypto-util.js +7 -0
  11. package/lib/crypto-util.js.map +1 -0
  12. package/lib/date-util-CG7L8nSP.js +184 -0
  13. package/lib/date-util-CG7L8nSP.js.map +1 -0
  14. package/lib/date-util-DopNKy3u.cjs +2 -0
  15. package/lib/date-util-DopNKy3u.cjs.map +1 -0
  16. package/lib/date-util.cjs +2 -0
  17. package/lib/date-util.cjs.map +1 -0
  18. package/lib/date-util.d.cts +231 -0
  19. package/lib/date-util.d.ts +231 -0
  20. package/lib/date-util.js +23 -0
  21. package/lib/date-util.js.map +1 -0
  22. package/lib/decimal.cjs +2 -0
  23. package/lib/decimal.cjs.map +1 -0
  24. package/lib/decimal.d.cts +197 -0
  25. package/lib/decimal.d.ts +197 -0
  26. package/lib/decimal.js +227 -0
  27. package/lib/decimal.js.map +1 -0
  28. package/lib/file-util-D09BvDYY.cjs +2 -0
  29. package/lib/file-util-D09BvDYY.cjs.map +1 -0
  30. package/lib/file-util-H-c_eQcd.js +140 -0
  31. package/lib/file-util-H-c_eQcd.js.map +1 -0
  32. package/lib/file-util.cjs +2 -0
  33. package/lib/file-util.cjs.map +1 -0
  34. package/lib/file-util.d.cts +119 -0
  35. package/lib/file-util.d.ts +119 -0
  36. package/lib/file-util.js +18 -0
  37. package/lib/file-util.js.map +1 -0
  38. package/lib/html-util-Bxn5YDSK.cjs +2 -0
  39. package/lib/html-util-Bxn5YDSK.cjs.map +1 -0
  40. package/lib/html-util-CgMIuOsf.js +49 -0
  41. package/lib/html-util-CgMIuOsf.js.map +1 -0
  42. package/lib/html-util.cjs +2 -0
  43. package/lib/html-util.cjs.map +1 -0
  44. package/lib/html-util.d.cts +71 -0
  45. package/lib/html-util.d.ts +71 -0
  46. package/lib/html-util.js +8 -0
  47. package/lib/html-util.js.map +1 -0
  48. package/lib/index.cjs +2 -0
  49. package/lib/index.cjs.map +1 -0
  50. package/lib/index.d.cts +9 -0
  51. package/lib/index.d.ts +8 -0
  52. package/lib/index.js +21 -38
  53. package/lib/index.js.map +1 -1
  54. package/lib/json-util-BvrFYh5E.cjs +3 -0
  55. package/lib/json-util-BvrFYh5E.cjs.map +1 -0
  56. package/lib/json-util-YX7xSF6R.js +136 -0
  57. package/lib/json-util-YX7xSF6R.js.map +1 -0
  58. package/lib/json-util.cjs +2 -0
  59. package/lib/json-util.cjs.map +1 -0
  60. package/lib/json-util.d.cts +58 -0
  61. package/lib/json-util.d.ts +58 -0
  62. package/lib/json-util.js +8 -0
  63. package/lib/json-util.js.map +1 -0
  64. package/lib/number-util-BA4KVFyF.js +198 -0
  65. package/lib/number-util-BA4KVFyF.js.map +1 -0
  66. package/lib/number-util-BaSf1wWH.cjs +2 -0
  67. package/lib/number-util-BaSf1wWH.cjs.map +1 -0
  68. package/lib/number-util.cjs +2 -0
  69. package/lib/number-util.cjs.map +1 -0
  70. package/lib/number-util.d.cts +237 -0
  71. package/lib/number-util.d.ts +65 -51
  72. package/lib/number-util.js +23 -495
  73. package/lib/number-util.js.map +1 -1
  74. package/lib/object-util-DhGi-PmA.js +204 -0
  75. package/lib/object-util-DhGi-PmA.js.map +1 -0
  76. package/lib/object-util-Z0Ah5J8A.cjs +2 -0
  77. package/lib/object-util-Z0Ah5J8A.cjs.map +1 -0
  78. package/lib/object-util.cjs +2 -0
  79. package/lib/object-util.cjs.map +1 -0
  80. package/lib/object-util.d.cts +157 -0
  81. package/lib/object-util.d.ts +157 -0
  82. package/lib/object-util.js +16 -0
  83. package/lib/object-util.js.map +1 -0
  84. package/lib/string-util-Cw0VgbIH.js +52 -0
  85. package/lib/string-util-Cw0VgbIH.js.map +1 -0
  86. package/lib/string-util-w2I5EYuY.cjs +2 -0
  87. package/lib/string-util-w2I5EYuY.cjs.map +1 -0
  88. package/lib/string-util.cjs +2 -0
  89. package/lib/string-util.cjs.map +1 -0
  90. package/lib/string-util.d.cts +51 -0
  91. package/lib/string-util.d.ts +51 -0
  92. package/lib/string-util.js +8 -0
  93. package/lib/string-util.js.map +1 -0
  94. package/package.json +59 -16
  95. package/src/crypto-util.ts +84 -0
  96. package/src/date-util.ts +448 -0
  97. package/src/decimal.ts +294 -0
  98. package/src/file-util.ts +281 -0
  99. package/src/html-util.ts +196 -0
  100. package/src/index.ts +8 -0
  101. package/src/json-util.ts +271 -0
  102. package/src/number-util.ts +141 -194
  103. package/src/object-util.ts +482 -0
  104. package/src/string-util.ts +115 -0
@@ -1,33 +1,6 @@
1
- /**
2
- * 数値として扱える値の型
3
- */
4
- export type NumberSource = number | string | bigint;
5
- /**
6
- * 丸めモード
7
- * 公開APIに内部の算術ライブラリ(big.js)の型を出さないよう、値を直接定義する(big.jsの丸めモードと同じ値)
8
- */
9
- export declare const ROUNDING_MODE: {
10
- /**
11
- * Rounds towards zero.
12
- * I.e. truncate, no rounding.
13
- */
14
- readonly roundDown: 0;
15
- /**
16
- * Rounds towards nearest neighbour.
17
- * If equidistant, rounds away from zero.
18
- */
19
- readonly roundHalfUp: 1;
20
- /**
21
- * Rounds towards nearest neighbour.
22
- * If equidistant, rounds towards even neighbour.
23
- */
24
- readonly roundHalfEven: 2;
25
- /**
26
- * Rounds away from zero.
27
- */
28
- readonly roundUp: 3;
29
- };
30
- export type RoundingMode = typeof ROUNDING_MODE[keyof typeof ROUNDING_MODE];
1
+ import { ROUNDING_MODE, NumberSource, RoundingMode } from './decimal';
2
+ export { ROUNDING_MODE };
3
+ export type { NumberSource, RoundingMode };
31
4
  /**
32
5
  * long(64bit)の範囲(-9223372036854775808〜9223372036854775807)の値か判定する
33
6
  * Javascriptのnumberの範囲は(-9007199254740991〜9007199254740991)である
@@ -96,7 +69,6 @@ export interface OperationItem {
96
69
  * 146 * 2 = 292
97
70
  * 292 / 3 = 97.33333333
98
71
  *
99
- * 数学的な感覚だと 123 + 123 - ((100 * 2) / 3) = 229.33333333 となるが、この関数はそのような計算を行わない
100
72
  * null等の扱いは add / sub / times / div と同じ
101
73
  * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる
102
74
  *
@@ -155,6 +127,66 @@ export declare function times(value1: NumberSource | null | undefined, ...value2
155
127
  * @returns {number}
156
128
  */
157
129
  export declare function div(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number;
130
+ /**
131
+ * 2つの値を数値として比較する
132
+ * null/undefined/空文字/NaNは0と見做す
133
+ * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる
134
+ *
135
+ * @param {NumberSource | null | undefined} value1
136
+ * @param {NumberSource | null | undefined} value2
137
+ * @returns {-1 | 0 | 1} value1がvalue2より小さい場合は-1、等しい場合は0、大きい場合は1
138
+ */
139
+ export declare function compareTo(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): -1 | 0 | 1;
140
+ /**
141
+ * 2つの値が数値として等しいかを返す
142
+ * null/undefined/空文字/NaNは0と見做す
143
+ * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる
144
+ *
145
+ * @param {NumberSource | null | undefined} value1
146
+ * @param {NumberSource | null | undefined} value2
147
+ * @returns {boolean}
148
+ */
149
+ export declare function eq(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean;
150
+ /**
151
+ * value1がvalue2より小さいかを返す
152
+ * null/undefined/空文字/NaNは0と見做す
153
+ * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる
154
+ *
155
+ * @param {NumberSource | null | undefined} value1
156
+ * @param {NumberSource | null | undefined} value2
157
+ * @returns {boolean}
158
+ */
159
+ export declare function lt(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean;
160
+ /**
161
+ * value1がvalue2以下かを返す
162
+ * null/undefined/空文字/NaNは0と見做す
163
+ * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる
164
+ *
165
+ * @param {NumberSource | null | undefined} value1
166
+ * @param {NumberSource | null | undefined} value2
167
+ * @returns {boolean}
168
+ */
169
+ export declare function lte(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean;
170
+ /**
171
+ * value1がvalue2より大きいかを返す
172
+ * null/undefined/空文字/NaNは0と見做す
173
+ * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる
174
+ *
175
+ * @param {NumberSource | null | undefined} value1
176
+ * @param {NumberSource | null | undefined} value2
177
+ * @returns {boolean}
178
+ */
179
+ export declare function gt(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean;
180
+ /**
181
+ * value1がvalue2以上かを返す
182
+ * null/undefined/空文字/NaNは0と見做す
183
+ * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる
184
+ *
185
+ * @param {NumberSource | null | undefined} value1
186
+ * @param {NumberSource | null | undefined} value2
187
+ * @returns {boolean}
188
+ */
189
+ export declare function gte(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean;
158
190
  /**
159
191
  * 数値を指定した桁で丸める
160
192
  * null/undefined/空文字はnull、数値として解釈できない文字列はNaNを返す
@@ -163,7 +195,7 @@ export declare function div(value1: NumberSource | null | undefined, ...value2:
163
195
  *
164
196
  * @param {NumberSource | null | undefined} value
165
197
  * @param {number} scale
166
- * @param {RoundingMode} roundingMode
198
+ * @param {RoundingMode} [roundingMode] デフォルトは 1: 四捨五入
167
199
  * 0 切り捨て
168
200
  * 1 四捨五入
169
201
  * 2 ISO丸め
@@ -171,7 +203,7 @@ export declare function div(value1: NumberSource | null | undefined, ...value2:
171
203
  * @returns {number | null}
172
204
  * @see ROUNDING_MODE
173
205
  */
174
- export declare function round(value: NumberSource | null | undefined, scale: number, roundingMode: RoundingMode): number | null;
206
+ export declare function round(value: NumberSource | null | undefined, scale: number, roundingMode?: RoundingMode): number | null;
175
207
  /**
176
208
  * 数値文字列に変換する
177
209
  * 指数表記にはならず、通常の表記で返す
@@ -188,24 +220,6 @@ export declare function toString(value: NumberSource | null | undefined, options
188
220
  scale?: number;
189
221
  roundingMode?: RoundingMode;
190
222
  }): string;
191
- /**
192
- * 数値型をビットの配列に変換する
193
- * 例)
194
- * 7 => [1, 2, 4]
195
- *
196
- * 第二引数に候補値の配列を渡した場合、対象リストの中から該当するもののうち、値の大きなものから抽出して配列で返す
197
- * 例)
198
- * 86, [2, 4, 80] => [2, 4, 80]
199
- * この例で第二引数を渡さない場合は 86 => [2, 4, 16, 64] になる
200
- * 候補値はそのビットがすべて立っている場合のみ該当とする(16, [80] => [])
201
- * いずれの候補値にも分類できないビットは無視される
202
- * 小数は切り捨て、0以下は空配列を返す
203
- *
204
- * @param {number} a
205
- * @param {(number | string)[]} [candidates]
206
- * @returns {number[]}
207
- */
208
- export declare function bitArray(a: number, candidates?: (number | string)[]): number[];
209
223
  /**
210
224
  * 渡されたバイト数値を桁数に応じてMB,GBなどに単位を変更する
211
225
  *
@@ -1,496 +1,24 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ROUNDING_MODE = void 0;
4
- exports.isLongValue = isLongValue;
5
- exports.formatComma = formatComma;
6
- exports.removeComma = removeComma;
7
- exports.formatCompact = formatCompact;
8
- exports.calc = calc;
9
- exports.add = add;
10
- exports.sub = sub;
11
- exports.times = times;
12
- exports.div = div;
13
- exports.round = round;
14
- exports.toString = toString;
15
- exports.bitArray = bitArray;
16
- exports.formatBytes = formatBytes;
17
- const big_js_1 = require("big.js");
18
- // 64bit整数の範囲
19
- const MIN_LONG = (0, big_js_1.Big)('-9223372036854775808');
20
- const MAX_LONG = (0, big_js_1.Big)('9223372036854775807');
21
- /**
22
- * 丸めモード
23
- * 公開APIに内部の算術ライブラリ(big.js)の型を出さないよう、値を直接定義する(big.jsの丸めモードと同じ値)
24
- */
25
- exports.ROUNDING_MODE = {
26
- /**
27
- * Rounds towards zero.
28
- * I.e. truncate, no rounding.
29
- */
30
- roundDown: 0,
31
- /**
32
- * Rounds towards nearest neighbour.
33
- * If equidistant, rounds away from zero.
34
- */
35
- roundHalfUp: 1,
36
- /**
37
- * Rounds towards nearest neighbour.
38
- * If equidistant, rounds towards even neighbour.
39
- */
40
- roundHalfEven: 2,
41
- /**
42
- * Rounds away from zero.
43
- */
44
- roundUp: 3
1
+ import { ROUNDING_MODE as o } from "./decimal.js";
2
+ import { a as m, c as e, b as r, d as f, e as c, f as d, g, h as i, i as l, j as p, k as n, l as u, m as C, r as b, o as v, s as x, t as D, p as N } from "./number-util-BA4KVFyF.js";
3
+ export {
4
+ o as ROUNDING_MODE,
5
+ m as add,
6
+ e as calc,
7
+ r as compareTo,
8
+ f as div,
9
+ c as eq,
10
+ d as formatBytes,
11
+ g as formatComma,
12
+ i as formatCompact,
13
+ l as gt,
14
+ p as gte,
15
+ n as isLongValue,
16
+ u as lt,
17
+ C as lte,
18
+ b as removeComma,
19
+ v as round,
20
+ x as sub,
21
+ D as times,
22
+ N as toString
45
23
  };
46
- /** 数値パターン */
47
- const NUMBER_PATTERN = new RegExp('([\+\-]?)([0-9]*)[\.]?([0-9]*)');
48
- /** 数値として解釈できる文字列のパターン(符号・小数点・指数表記) */
49
- const NUMERIC_STRING_PATTERN = /^[+-]?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i;
50
- function toBig(value) {
51
- // @types/big.js の型定義が bigint を含まないため、文字列にして渡す
52
- return (0, big_js_1.Big)(typeof value === 'bigint' ? value.toString() : value);
53
- }
54
- /**
55
- * long(64bit)の範囲(-9223372036854775808〜9223372036854775807)の値か判定する
56
- * Javascriptのnumberの範囲は(-9007199254740991〜9007199254740991)である
57
- *
58
- * @param {string | bigint} value
59
- * @param {*} [options]
60
- * ├ minValue number 最小値を指定する場合(0を指定すると負数の場合falseを返す)
61
- * 不正な値を指定した場合は無視される(最小値を-9223372036854775808とみなす)
62
- * @returns {boolean}
63
- * @see Number.MAX_SAFE_INTEGER
64
- * @see Number.MIN_SAFE_INTEGER
65
- */
66
- function isLongValue(value, options) {
67
- let min;
68
- if (options?.minValue != null) {
69
- try {
70
- min = (0, big_js_1.Big)(options.minValue);
71
- }
72
- catch (error) {
73
- min = MIN_LONG;
74
- }
75
- }
76
- else {
77
- min = MIN_LONG;
78
- }
79
- try {
80
- // -9223372036854775808 <= value <= 9223372036854775807
81
- return min.lte(value.toString()) && MAX_LONG.gte(value.toString());
82
- }
83
- catch (error) {
84
- // 数値以外やnullが渡された場合エラーになるためfalseを返却([big.js] Invalid number)
85
- return false;
86
- }
87
- }
88
- /**
89
- * 3桁ごとカンマ区切りした文字列を返す
90
- * 指数表記の値(1e21など)は通常の表記に展開してから区切る
91
- * 数値として解釈できない文字列はそのまま返し、NaN/Infinityは "NaN"/"Infinity"/"-Infinity" を返す
92
- *
93
- * @param {NumberSource | null | undefined} value 値
94
- * @param {number} [scale] 小数点桁数(補助桁数)
95
- * @param {RoundingMode} [roundingMode] 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)
96
- * @returns {string}
97
- */
98
- function formatComma(value, scale, roundingMode) {
99
- if (value == null || value === '') {
100
- // 空文字を返却
101
- return '';
102
- }
103
- let strValue;
104
- switch (typeof value) {
105
- case 'number':
106
- if (!Number.isFinite(value)) {
107
- // "NaN" / "Infinity" / "-Infinity" を返却
108
- return String(value);
109
- }
110
- // toString()は1e21以上や1e-7以下を指数表記にするため、Bigで通常の表記に展開する
111
- strValue = (0, big_js_1.Big)(value).toFixed();
112
- break;
113
- case 'string':
114
- strValue = removeComma(value).trim();
115
- if (!NUMERIC_STRING_PATTERN.test(strValue)) {
116
- // 元の文字列を返却
117
- return value;
118
- }
119
- if (/e/i.test(strValue)) {
120
- // 指数表記を通常の表記に展開する。Big.jsは '+' を受け付けないため外して渡し、表示用に付け直す
121
- const plusSign = strValue.startsWith('+') ? '+' : '';
122
- strValue = `${plusSign}${(0, big_js_1.Big)(strValue.replace(/^\+/, '')).toFixed()}`;
123
- }
124
- break;
125
- default:
126
- // bigintの場合
127
- strValue = value.toString();
128
- }
129
- const matches = NUMBER_PATTERN.exec(strValue);
130
- const sign = matches[1];
131
- let natural = matches[2] || '0';
132
- let decimal = matches[3];
133
- let dp;
134
- // Big.jsに渡すとき '+' が付いているとエラーになる
135
- let big = new big_js_1.Big(`${sign === '-' ? '-' : ''}${natural}.${decimal}`);
136
- if (scale != null) {
137
- big = big.round(scale, roundingMode ?? exports.ROUNDING_MODE.roundHalfUp);
138
- const roundedMatches = NUMBER_PATTERN.exec(big.toFixed());
139
- natural = roundedMatches[2];
140
- decimal = roundedMatches[3];
141
- dp = scale;
142
- }
143
- else {
144
- dp = decimal.length;
145
- }
146
- // 丸めた結果がゼロになる場合('-0.001' を小数2桁にするなど)に "-0.00" とならないよう、丸めた後の値で判定する
147
- const displaySign = big.eq(0) ? '' : sign;
148
- natural = natural.replace(/(\d)(?=(\d{3})+$)/g, '$1,');
149
- decimal = `${decimal}${'0'.repeat(dp)}`.substring(0, dp);
150
- return decimal === ''
151
- ? `${displaySign}${natural}`
152
- : `${displaySign}${natural}.${decimal}`;
153
- }
154
- /**
155
- * カンマを除去する
156
- *
157
- * @param {string} value 入力値
158
- * @returns {string} カンマを取り除いた文字列
159
- */
160
- function removeComma(value) {
161
- return value.replace(/,/g, '');
162
- }
163
- /**
164
- * 数値を表示ロケールの短縮表記にする。
165
- * en は 1.2K/3.4M/5.6B、ja は 12万/34億 のように単位が切り替わる。
166
- *
167
- * @param {number} value 値
168
- * @param {string} locale 表示ロケール(例 'ja' / 'en')
169
- * @returns {string} 短縮表記の文字列
170
- */
171
- function formatCompact(value, locale) {
172
- return new Intl.NumberFormat(locale, { notation: 'compact' }).format(value);
173
- }
174
- // null/undefined/空文字/NaNはtrueを返す
175
- const isLikelyUndefined = (b) => b == null || b === '' || (typeof b === 'number' && Number.isNaN(b));
176
- // 演算の初期値。null/undefined/空文字/NaNはゼロとみなす
177
- const toInitialBig = (value) => isLikelyUndefined(value) ? (0, big_js_1.Big)(0) : toBig(value);
178
- const operators = {
179
- // null/undefined/空文字/NaNはゼロとみなす
180
- add: (a, b) => a.add(isLikelyUndefined(b) ? 0 : toBig(b)),
181
- // null/undefined/空文字/NaNはゼロとみなす
182
- sub: (a, b) => a.sub(isLikelyUndefined(b) ? 0 : toBig(b)),
183
- /**
184
- * 乗算の場合の'b'の値は、計算したい対象によってゼロとみなすのか無視して元の値を保持したいのかの概念が異なる
185
- * ゼロとみなしたい場合の例:
186
- * 手数料 x 件数
187
- * → このとき件数が未定義(≒ 0)だったら手数料総計は0が適切
188
- * 無視して元の値を保持したい場合の例:
189
- * 商品価格 x 割引率
190
- * → このとき割引率が未定義(≒ 1)だったら販売価格は元の値(商品価格)が適切
191
- *
192
- * この関数のデフォルトの挙動は「ゼロとみなす」とする
193
- * 1とみなすと、第1引数のnullはゼロとみなすため times(3, null) = 3、times(null, 3) = 0 のように引数の順序で結果が変わってしまう
194
- * 元の値を保持したいケースでは
195
- * NumberUtil.times(price, discount ?? 1)
196
- * のように、discountが未定義だった場合のフォールバック値を指定する
197
- */
198
- // null/undefined/空文字/NaNはゼロとみなす
199
- times: (a, b) => a.times(isLikelyUndefined(b) ? 0 : toBig(b)),
200
- /**
201
- * 除算の場合`isLikelyUndefined(b) = true`をゼロとみなす挙動にすると、0, null, undefined, 空文字などすべてゼロ除算エラーになってしまうため
202
- * 割る値に限り1とみなし、元の値を保持する挙動とする(明示的に0を指定した場合はゼロ除算エラー)
203
- * 例) 割引率で割る計算で、割引率が未定義なら元の値が適切
204
- */
205
- // null/undefined/空文字/NaNは1とみなす(a / 1 = a)。0を演算対象にするとゼロ除算エラーが発生する
206
- div: (a, b) => isLikelyUndefined(b) ? a : a.div(toBig(b))
207
- };
208
- function calcAsBig(initialValue, operationItems) {
209
- let bigvalue = toInitialBig(initialValue);
210
- for (const item of operationItems) {
211
- bigvalue = operators[item.operator](bigvalue, item.value);
212
- }
213
- return bigvalue;
214
- }
215
- /**
216
- * 複数の演算をまとめて計算する
217
- * 計算途中は精度を保持し、最後にnumberへ変換する
218
- * この関数では四則演算の優先順位はなく、与えられた配列の順で計算を行う
219
- * * 優先順位やカッコの概念がある場合は事前に計算したうえでこの関数を利用する
220
- *
221
- * 例)
222
- * calc(
223
- * '123',
224
- * [
225
- * { operator: 'add', value: '123' },
226
- * { operator: 'sub', value: 100 },
227
- * { operator: 'times', value: 2 },
228
- * { operator: 'div', value: 3 }
229
- * ]
230
- * )
231
- * 123 + 123 = 246
232
- * 246 - 100 = 146
233
- * 146 * 2 = 292
234
- * 292 / 3 = 97.33333333
235
- *
236
- * 数学的な感覚だと 123 + 123 - ((100 * 2) / 3) = 229.33333333 となるが、この関数はそのような計算を行わない
237
- * null等の扱いは add / sub / times / div と同じ
238
- * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる
239
- *
240
- * @param {NumberSource | null | undefined} initialValue
241
- * @param {OperationItem[]} operationItems
242
- * ├ operator: Operator
243
- * ├ value: NumberSource | null | undefined
244
- * @param {*} [options]
245
- * ├ scale 計算結果を丸める小数桁数。指定しない場合は丸めない
246
- * ├ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)
247
- * @returns {number}
248
- */
249
- function calc(initialValue, operationItems, options) {
250
- let bigvalue = calcAsBig(initialValue, operationItems);
251
- if (options?.scale != null) {
252
- bigvalue = bigvalue.round(options.scale, options.roundingMode ?? exports.ROUNDING_MODE.roundHalfUp);
253
- }
254
- return bigvalue.toNumber();
255
- }
256
- /**
257
- * 加算を行う
258
- * null/undefined/空文字/NaNは0と見做されるため、演算結果に影響しない
259
- * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる
260
- *
261
- * @param {NumberSource | null | undefined} value1
262
- * @param {(NumberSource | null | undefined)[]} value2
263
- * @returns {number}
264
- */
265
- function add(value1, ...value2) {
266
- let bigvalue = toInitialBig(value1);
267
- for (const value of value2) {
268
- bigvalue = operators.add(bigvalue, value);
269
- }
270
- return bigvalue.toNumber();
271
- }
272
- /**
273
- * 減算を行う
274
- * null/undefined/空文字/NaNは0と見做されるため、演算結果に影響しない
275
- * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる
276
- *
277
- * @param {NumberSource | null | undefined} value1
278
- * @param {(NumberSource | null | undefined)[]} value2
279
- * @returns {number}
280
- */
281
- function sub(value1, ...value2) {
282
- let bigvalue = toInitialBig(value1);
283
- for (const value of value2) {
284
- bigvalue = operators.sub(bigvalue, value);
285
- }
286
- return bigvalue.toNumber();
287
- }
288
- /**
289
- * 乗算を行う
290
- * null/undefined/空文字/NaNは0と見做されるため、演算結果は0になる
291
- * 元の値を保持したい場合は times(price, discount ?? 1) のようにフォールバック値を指定する
292
- * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる
293
- *
294
- * @param {NumberSource | null | undefined} value1
295
- * @param {(NumberSource | null | undefined)[]} value2
296
- * @returns {number}
297
- */
298
- function times(value1, ...value2) {
299
- let bigvalue = toInitialBig(value1);
300
- for (const value of value2) {
301
- bigvalue = operators.times(bigvalue, value);
302
- }
303
- return bigvalue.toNumber();
304
- }
305
- /**
306
- * 除算を行う
307
- * 割る値のnull/undefined/空文字/NaNは1と見做されるため、演算結果に影響しない
308
- * 割る値に0を指定した場合はゼロ除算エラーになる
309
- * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる
310
- *
311
- * @param {NumberSource | null | undefined} value1
312
- * @param {(NumberSource | null | undefined)[]} value2
313
- * @returns {number}
314
- */
315
- function div(value1, ...value2) {
316
- let bigvalue = toInitialBig(value1);
317
- for (const value of value2) {
318
- bigvalue = operators.div(bigvalue, value);
319
- }
320
- return bigvalue.toNumber();
321
- }
322
- /**
323
- * 数値を指定した桁で丸める
324
- * null/undefined/空文字はnull、数値として解釈できない文字列はNaNを返す
325
- * NaN/Infinityはそのまま返す
326
- * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる
327
- *
328
- * @param {NumberSource | null | undefined} value
329
- * @param {number} scale
330
- * @param {RoundingMode} roundingMode
331
- * 0 切り捨て
332
- * 1 四捨五入
333
- * 2 ISO丸め
334
- * 3 切り上げ
335
- * @returns {number | null}
336
- * @see ROUNDING_MODE
337
- */
338
- function round(value, scale, roundingMode) {
339
- if (value == null) {
340
- return null;
341
- }
342
- switch (typeof value) {
343
- case 'number':
344
- if (!Number.isFinite(value)) {
345
- // Big.jsはNaN/Infinityを扱えないため
346
- return value;
347
- }
348
- return (0, big_js_1.Big)(value).round(scale, roundingMode).toNumber();
349
- case 'string': {
350
- const trimmed = value.trim();
351
- if (trimmed === '') {
352
- // 空文字は値なしとしてnullと同じ扱いにする
353
- return null;
354
- }
355
- try {
356
- return (0, big_js_1.Big)(trimmed).round(scale, roundingMode).toNumber();
357
- }
358
- catch (error) {
359
- // 数値として解釈できない文字列([big.js] Invalid number)
360
- return Number.NaN;
361
- }
362
- }
363
- default:
364
- return toBig(value).round(scale, roundingMode).toNumber();
365
- }
366
- }
367
- /**
368
- * 数値文字列に変換する
369
- * 指数表記にはならず、通常の表記で返す
370
- * 数値として解釈できない値はString(value)を返す
371
- *
372
- * @param {NumberSource | null | undefined} value
373
- * @param {*} [options]
374
- * ├ scale 小数桁数。指定しない場合は丸めずにすべての桁を返す
375
- * ├ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)
376
- * @returns {string}
377
- * @see ROUNDING_MODE
378
- */
379
- function toString(value, options) {
380
- if (value == null) {
381
- return '';
382
- }
383
- try {
384
- const big = toBig(value);
385
- return options?.scale != null
386
- ? big.toFixed(options.scale, options.roundingMode ?? exports.ROUNDING_MODE.roundHalfUp)
387
- : big.toFixed();
388
- }
389
- catch (error) {
390
- return String(value);
391
- }
392
- }
393
- /**
394
- * 数値型をビットの配列に変換する
395
- * 例)
396
- * 7 => [1, 2, 4]
397
- *
398
- * 第二引数に候補値の配列を渡した場合、対象リストの中から該当するもののうち、値の大きなものから抽出して配列で返す
399
- * 例)
400
- * 86, [2, 4, 80] => [2, 4, 80]
401
- * この例で第二引数を渡さない場合は 86 => [2, 4, 16, 64] になる
402
- * 候補値はそのビットがすべて立っている場合のみ該当とする(16, [80] => [])
403
- * いずれの候補値にも分類できないビットは無視される
404
- * 小数は切り捨て、0以下は空配列を返す
405
- *
406
- * @param {number} a
407
- * @param {(number | string)[]} [candidates]
408
- * @returns {number[]}
409
- */
410
- function bitArray(a, candidates) {
411
- const array = [];
412
- const integer = Math.trunc(a);
413
- if (!Number.isFinite(integer) || integer < 1) {
414
- return array;
415
- }
416
- // ビット演算子は値を32bit整数に切り詰めるため、2^32以上で判定が狂い無限ループになる。BigIntで演算する
417
- let val = BigInt(integer);
418
- if (candidates) {
419
- const cloneArray = candidates.map(a => Number(a)).filter(a => Number.isInteger(a) && 0 < a);
420
- cloneArray.sort((a, b) => {
421
- return b - a;
422
- });
423
- for (const clone of cloneArray) {
424
- const bits = BigInt(clone);
425
- if ((val & bits) === bits) {
426
- array.push(clone);
427
- val -= bits;
428
- }
429
- }
430
- array.sort((a, b) => {
431
- return a - b;
432
- });
433
- }
434
- else {
435
- const zero = BigInt(0);
436
- let bit = BigInt(1);
437
- while (zero < val) {
438
- if ((val & bit) !== zero) {
439
- array.push(Number(bit));
440
- val -= bit;
441
- }
442
- bit *= BigInt(2);
443
- }
444
- }
445
- return array;
446
- }
447
- /**
448
- * 渡されたバイト数値を桁数に応じてMB,GBなどに単位を変更する
449
- *
450
- * @param {NumberSource} bytes
451
- * @param {*} [options]
452
- * ┝ scale 小数以下桁数 デフォルト:2
453
- * ┝ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)
454
- * ┝ format フォーマットするか。trueを指定した場合、3桁カンマ区切り+小数末尾0の桁揃え
455
- * @returns {[string, string]} 精度以下を丸めた数値(文字列)と単位をタプルで返す
456
- */
457
- function formatBytes(bytes, options) {
458
- if (bytes == null || bytes === '') {
459
- return [String(bytes), ''];
460
- }
461
- let bigValue;
462
- switch (typeof bytes) {
463
- case 'number':
464
- if (Number.isNaN(bytes)) {
465
- // "NaN" を返却
466
- return ['NaN', ''];
467
- }
468
- bigValue = (0, big_js_1.Big)(bytes);
469
- break;
470
- case 'string':
471
- try {
472
- bigValue = (0, big_js_1.Big)(removeComma(bytes));
473
- }
474
- catch (error) {
475
- // 元の文字列を返却
476
- return [bytes, ''];
477
- }
478
- break;
479
- default:
480
- // bigintの場合
481
- bigValue = toBig(bytes);
482
- }
483
- const units = ['B', 'KB', 'MB', 'GB', 'TB'];
484
- let i = 0;
485
- while (bigValue.gte(1024) && i < units.length - 1) {
486
- bigValue = bigValue.div(1024);
487
- i++;
488
- }
489
- const scale = options?.scale ?? 2;
490
- const roundingMode = options?.roundingMode ?? exports.ROUNDING_MODE.roundHalfUp;
491
- if (options?.format) {
492
- return [formatComma(bigValue.toFixed(), scale, roundingMode), units[i]];
493
- }
494
- return [bigValue.round(scale, roundingMode).toString(), units[i]];
495
- }
496
- //# sourceMappingURL=number-util.js.map
24
+ //# sourceMappingURL=number-util.js.map