@digitalwalletcorp/utils 0.5.0 → 0.6.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/lib/index.cjs +1 -1
- package/lib/index.js +2 -2
- package/lib/number-util-BrDEKYJo.cjs +2 -0
- package/lib/{number-util-BaSf1wWH.cjs.map → number-util-BrDEKYJo.cjs.map} +1 -1
- package/lib/{number-util-BA4KVFyF.js → number-util-Wpubbqr4.js} +101 -67
- package/lib/{number-util-BA4KVFyF.js.map → number-util-Wpubbqr4.js.map} +1 -1
- package/lib/number-util.cjs +1 -1
- package/lib/number-util.d.cts +28 -0
- package/lib/number-util.d.ts +28 -0
- package/lib/number-util.js +10 -9
- package/lib/{object-util-auzl09b5.js → object-util-BFc8L2u1.js} +34 -20
- package/lib/{object-util-auzl09b5.js.map → object-util-BFc8L2u1.js.map} +1 -1
- package/lib/{object-util-6uts5Xax.cjs → object-util-D-XiTVyo.cjs} +2 -2
- package/lib/{object-util-6uts5Xax.cjs.map → object-util-D-XiTVyo.cjs.map} +1 -1
- package/lib/object-util.cjs +1 -1
- package/lib/object-util.d.cts +31 -0
- package/lib/object-util.d.ts +31 -0
- package/lib/object-util.js +7 -6
- package/package.json +1 -1
- package/src/number-util.ts +66 -0
- package/src/object-util.ts +39 -0
- package/lib/number-util-BaSf1wWH.cjs +0 -2
package/src/number-util.ts
CHANGED
|
@@ -419,6 +419,72 @@ export function toString(
|
|
|
419
419
|
}
|
|
420
420
|
}
|
|
421
421
|
|
|
422
|
+
/** toNumber のオプション */
|
|
423
|
+
export interface ToNumberOptions {
|
|
424
|
+
/** 未指定(null・undefined・空白のみの文字列)のときに返す値。デフォルトは 'null' */
|
|
425
|
+
empty?: 'null' | 'undefined' | 'zero';
|
|
426
|
+
/** 数値として解釈できない(結果が NaN になる)ときに返す値。デフォルトは 'NaN' */
|
|
427
|
+
nan?: 'NaN' | 'null' | 'undefined';
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
/** options.empty に応じた未指定時の戻り値の型。'zero' は number に含まれるので never */
|
|
431
|
+
type EmptyResult<O extends ToNumberOptions> = O extends { empty?: infer E }
|
|
432
|
+
? E extends 'undefined' ? undefined : E extends 'zero' ? never : null
|
|
433
|
+
: null;
|
|
434
|
+
|
|
435
|
+
/** options.nan に応じた変換不可時の戻り値の型。'NaN' は number に含まれるので never */
|
|
436
|
+
type NanResult<O extends ToNumberOptions> = O extends { nan?: infer N }
|
|
437
|
+
? N extends 'null' ? null : N extends 'undefined' ? undefined : never
|
|
438
|
+
: never;
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* 数値に変換する
|
|
442
|
+
* 文字列はカンマと前後の空白を除いてから変換する
|
|
443
|
+
* null・undefined・空白のみの文字列は未指定として扱い、options.empty に応じて null(デフォルト)・undefined・0 のいずれかを返す
|
|
444
|
+
* 数値として解釈できない場合は options.nan に応じて NaN(デフォルト)・null・undefined のいずれかを返す
|
|
445
|
+
*
|
|
446
|
+
* @param {NumberSource | null | undefined} value
|
|
447
|
+
* @param {ToNumberOptions} [options]
|
|
448
|
+
* ├ empty 未指定のときに返す値。'null'(デフォルト) | 'undefined' | 'zero'
|
|
449
|
+
* └ nan 数値として解釈できないときに返す値。'NaN'(デフォルト) | 'null' | 'undefined'
|
|
450
|
+
* @returns {number | EmptyResult<O> | NanResult<O>} 戻り値の型は options に連動する
|
|
451
|
+
*/
|
|
452
|
+
export function toNumber<O extends ToNumberOptions = Record<never, never>>(value: NumberSource | null | undefined, options?: O): number | EmptyResult<O> | NanResult<O> {
|
|
453
|
+
type Result = number | EmptyResult<O> | NanResult<O>;
|
|
454
|
+
if (value == null || isBlank(value)) {
|
|
455
|
+
switch (options?.empty) {
|
|
456
|
+
case 'undefined':
|
|
457
|
+
return undefined as Result;
|
|
458
|
+
case 'zero':
|
|
459
|
+
return 0;
|
|
460
|
+
default:
|
|
461
|
+
return null as Result;
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
let result: number;
|
|
465
|
+
switch (typeof value) {
|
|
466
|
+
case 'number':
|
|
467
|
+
result = value;
|
|
468
|
+
break;
|
|
469
|
+
case 'bigint':
|
|
470
|
+
result = Number(value);
|
|
471
|
+
break;
|
|
472
|
+
default:
|
|
473
|
+
result = Number(removeComma(value).trim());
|
|
474
|
+
}
|
|
475
|
+
if (Number.isNaN(result)) {
|
|
476
|
+
switch (options?.nan) {
|
|
477
|
+
case 'null':
|
|
478
|
+
return null as Result;
|
|
479
|
+
case 'undefined':
|
|
480
|
+
return undefined as Result;
|
|
481
|
+
default:
|
|
482
|
+
return result;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
return result;
|
|
486
|
+
}
|
|
487
|
+
|
|
422
488
|
/**
|
|
423
489
|
* 渡されたバイト数値を桁数に応じてMB,GBなどに単位を変更する
|
|
424
490
|
*
|
package/src/object-util.ts
CHANGED
|
@@ -441,6 +441,45 @@ export function hashCode(value: any): number {
|
|
|
441
441
|
return hash >>> 0;
|
|
442
442
|
}
|
|
443
443
|
|
|
444
|
+
/**
|
|
445
|
+
* 配列でない値を配列に包み、値が配列であることを保証する
|
|
446
|
+
* 配列はそのまま返し、それ以外の値は1要素の配列にする。null・undefined の扱いは options.nullish で指定する
|
|
447
|
+
*
|
|
448
|
+
* 主な用途は、1件なら単一の値、複数なら配列で届くリクエストパラメータ(クエリ文字列の同名パラメータなど)を配列に統一すること。
|
|
449
|
+
* 単一の値と配列の両方を受け付ける引数を配列に揃える場面であれば、ほかの用途にも使える
|
|
450
|
+
*
|
|
451
|
+
* @example
|
|
452
|
+
* ensureArray('a'); // ['a']
|
|
453
|
+
* ensureArray(['a', 'b']); // ['a', 'b'] (同じ配列)
|
|
454
|
+
* ensureArray(undefined); // [undefined]
|
|
455
|
+
* ensureArray(undefined, { nullish: 'empty' }); // []
|
|
456
|
+
* ensureArray(undefined, { nullish: 'keep' }); // undefined
|
|
457
|
+
*
|
|
458
|
+
* @param {T | T[] | null | undefined} value
|
|
459
|
+
* @param {*} [options]
|
|
460
|
+
* └ nullish null・undefined を渡したときの扱い。デフォルトは 'wrap'
|
|
461
|
+
* 'wrap' 1要素の配列に包む([null] / [undefined])。lodash の castArray と同じ無損失の変換
|
|
462
|
+
* 'empty' 空配列にする。未指定を「要素なし」として扱うとき
|
|
463
|
+
* 'keep' そのまま返す。未指定を区別したまま呼び出し側で扱うとき
|
|
464
|
+
* @returns {T[]} nullish が 'keep' の場合は null・undefined も返す
|
|
465
|
+
*/
|
|
466
|
+
export function ensureArray<T>(value: T | T[], options?: { nullish?: 'wrap' }): T[];
|
|
467
|
+
export function ensureArray<T>(value: T | T[] | null | undefined, options: { nullish: 'empty' }): NonNullable<T>[];
|
|
468
|
+
export function ensureArray<T>(value: T | T[] | null | undefined, options: { nullish: 'keep' }): NonNullable<T>[] | null | undefined;
|
|
469
|
+
export function ensureArray<T>(value: T | T[] | null | undefined, options?: { nullish?: 'wrap' | 'empty' | 'keep' }): T[] | null | undefined {
|
|
470
|
+
if (value == null) {
|
|
471
|
+
switch (options?.nullish) {
|
|
472
|
+
case 'empty':
|
|
473
|
+
return [];
|
|
474
|
+
case 'keep':
|
|
475
|
+
return value as null | undefined;
|
|
476
|
+
default:
|
|
477
|
+
return [value as T];
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
return Array.isArray(value) ? value : [value];
|
|
481
|
+
}
|
|
482
|
+
|
|
444
483
|
/**
|
|
445
484
|
* 配列から重複する要素を除いた新しい配列を返す
|
|
446
485
|
* ・null / undefined の要素は除く
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";const i=require("./decimal.cjs"),C=new i.Decimal("-9223372036854775808"),V=new i.Decimal("9223372036854775807"),w=new RegExp("([+-]?)([0-9]*)[.]?([0-9]*)"),y=/^[+-]?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i,N=e=>typeof e=="string"&&e.trim()==="";function b(e,t){if(e==null||N(e))return!1;const n=Number.isFinite(t?.minValue)?new i.Decimal(t.minValue):C;try{return n.lte(e)&&V.gte(e)}catch{return!1}}function g(e,t,n){if(e==null||e==="")return"";let r;switch(typeof e){case"number":if(!Number.isFinite(e))return String(e);r=new i.Decimal(e).toString();break;case"string":if(r=s(e).trim(),!y.test(r))return e;/e/i.test(r)&&(r=`${r.startsWith("+")?"+":""}${new i.Decimal(r).toString()}`);break;default:r=e.toString()}const o=w.exec(r),l=o[1];let c=o[2]||"0",u=o[3],a,f=new i.Decimal(`${l==="-"?"-":""}${c}.${u}`);if(t!=null){f=f.round(t,n??i.ROUNDING_MODE.roundHalfUp);const d=w.exec(f.toString());c=d[2],u=d[3],a=t}else a=u.length;const D=f.eq(0)?"":l;return c=c.replace(/(\d)(?=(\d{3})+$)/g,"$1,"),u=`${u}${"0".repeat(a)}`.substring(0,a),u===""?`${D}${c}`:`${D}${c}.${u}`}function s(e){return e.replace(/,/g,"")}function $(e,t){return new Intl.NumberFormat(t,{notation:"compact"}).format(e)}function p(e,t,n){let r=new i.Decimal(e);for(const o of t)r=r[o.operator](o.value);return n?.scale!=null&&(r=r.round(n.scale,n.roundingMode??i.ROUNDING_MODE.roundHalfUp)),r.toNumber()}function S(e,...t){let n=new i.Decimal(e);for(const r of t)n=n.add(r);return n.toNumber()}function M(e,...t){let n=new i.Decimal(e);for(const r of t)n=n.sub(r);return n.toNumber()}function O(e,...t){let n=new i.Decimal(e);for(const r of t)n=n.times(r);return n.toNumber()}function U(e,...t){let n=new i.Decimal(e);for(const r of t)n=n.div(r);return n.toNumber()}function m(e,t){return new i.Decimal(e).compareTo(t)}function _(e,t){return m(e,t)===0}function h(e,t){return m(e,t)<0}function R(e,t){return m(e,t)<=0}function E(e,t){return 0<m(e,t)}function G(e,t){return 0<=m(e,t)}function I(e,t,n){if(e==null)return null;const r=n??i.ROUNDING_MODE.roundHalfUp;switch(typeof e){case"number":return Number.isFinite(e)?new i.Decimal(e).round(t,r).toNumber():e;case"string":{if(N(e))return null;try{return new i.Decimal(e).round(t,r).toNumber()}catch{return Number.NaN}}default:return new i.Decimal(e).round(t,r).toNumber()}}function T(e,t){if(e==null)return"";if(N(e)||typeof e=="number"&&!Number.isFinite(e))return String(e);try{const n=new i.Decimal(e);return t?.scale!=null?n.toFixed(t.scale,t.roundingMode??i.ROUNDING_MODE.roundHalfUp):n.toString()}catch{return String(e)}}function B(e,t){if(e==null||e==="")return[String(e),""];let n;switch(typeof e){case"number":if(Number.isNaN(e))return["NaN",""];n=new i.Decimal(e);break;case"string":try{n=new i.Decimal(s(e))}catch{return[e,""]}break;default:n=new i.Decimal(e)}const r=["B","KB","MB","GB","TB"];let o=0;for(;n.gte(1024)&&o<r.length-1;)n=n.div(1024),o++;const l=t?.scale??2,c=t?.roundingMode??i.ROUNDING_MODE.roundHalfUp;return t?.format?[g(n.toString(),l,c),r[o]]:[n.round(l,c).toString(),r[o]]}const F=Object.freeze(Object.defineProperty({__proto__:null,ROUNDING_MODE:i.ROUNDING_MODE,add:S,calc:p,compareTo:m,div:U,eq:_,formatBytes:B,formatComma:g,formatCompact:$,gt:E,gte:G,isLongValue:b,lt:h,lte:R,removeComma:s,round:I,sub:M,times:O,toString:T},Symbol.toStringTag,{value:"Module"}));exports.add=S;exports.calc=p;exports.compareTo=m;exports.div=U;exports.eq=_;exports.formatBytes=B;exports.formatComma=g;exports.formatCompact=$;exports.gt=E;exports.gte=G;exports.isLongValue=b;exports.lt=h;exports.lte=R;exports.numberUtil=F;exports.removeComma=s;exports.round=I;exports.sub=M;exports.times=O;exports.toString=T;
|
|
2
|
-
//# sourceMappingURL=number-util-BaSf1wWH.cjs.map
|