@digitalwalletcorp/utils 0.6.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 CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./crypto-util-BcHurtbE.cjs"),i=require("./date-util-DG-ujlhH.cjs"),e=require("./decimal.cjs"),l=require("./file-util-D09BvDYY.cjs"),r=require("./html-util-ClGIpzW1.cjs"),U=require("./json-util-5mq7fsX_.cjs"),o=require("./number-util-BSra7lF5.cjs"),c=require("./object-util-D-XiTVyo.cjs"),n=require("./string-util-w2I5EYuY.cjs");exports.CryptoUtil=t.cryptoUtil;exports.DateUtil=i.dateUtil;exports.Decimal=e.Decimal;exports.FileUtil=l.fileUtil;exports.HtmlUtil=r.htmlUtil;exports.JsonUtil=U.jsonUtil;exports.NumberUtil=o.numberUtil;exports.ObjectUtil=c.objectUtil;exports.StringUtil=n.stringUtil;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./crypto-util-BcHurtbE.cjs"),i=require("./date-util-DG-ujlhH.cjs"),e=require("./decimal.cjs"),l=require("./file-util-D09BvDYY.cjs"),r=require("./html-util-ClGIpzW1.cjs"),U=require("./json-util-5mq7fsX_.cjs"),o=require("./number-util-BrDEKYJo.cjs"),c=require("./object-util-D-XiTVyo.cjs"),n=require("./string-util-w2I5EYuY.cjs");exports.CryptoUtil=t.cryptoUtil;exports.DateUtil=i.dateUtil;exports.Decimal=e.Decimal;exports.FileUtil=l.fileUtil;exports.HtmlUtil=r.htmlUtil;exports.JsonUtil=U.jsonUtil;exports.NumberUtil=o.numberUtil;exports.ObjectUtil=c.objectUtil;exports.StringUtil=n.stringUtil;
2
2
  //# sourceMappingURL=index.cjs.map
package/lib/index.js CHANGED
@@ -4,7 +4,7 @@ import { Decimal as l } from "./decimal.js";
4
4
  import { f } from "./file-util-H-c_eQcd.js";
5
5
  import { h as s } from "./html-util-CcRJtzod.js";
6
6
  import { j as U } from "./json-util-CF-O1b7m.js";
7
- import { n } from "./number-util-DXjPN_-P.js";
7
+ import { n } from "./number-util-Wpubbqr4.js";
8
8
  import { o as j } from "./object-util-BFc8L2u1.js";
9
9
  import { s as d } from "./string-util-Cw0VgbIH.js";
10
10
  export {
@@ -0,0 +1,2 @@
1
+ "use strict";const i=require("./decimal.cjs"),k=new i.Decimal("-9223372036854775808"),C=new i.Decimal("9223372036854775807"),D=new RegExp("([+-]?)([0-9]*)[.]?([0-9]*)"),V=/^[+-]?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i,d=e=>typeof e=="string"&&e.trim()==="";function w(e,t){if(e==null||d(e))return!1;const r=Number.isFinite(t?.minValue)?new i.Decimal(t.minValue):k;try{return r.lte(e)&&C.gte(e)}catch{return!1}}function g(e,t,r){if(e==null||e==="")return"";let n;switch(typeof e){case"number":if(!Number.isFinite(e))return String(e);n=new i.Decimal(e).toString();break;case"string":if(n=a(e).trim(),!V.test(n))return e;/e/i.test(n)&&(n=`${n.startsWith("+")?"+":""}${new i.Decimal(n).toString()}`);break;default:n=e.toString()}const o=D.exec(n),l=o[1];let u=o[2]||"0",c=o[3],f,s=new i.Decimal(`${l==="-"?"-":""}${u}.${c}`);if(t!=null){s=s.round(t,r??i.ROUNDING_MODE.roundHalfUp);const N=D.exec(s.toString());u=N[2],c=N[3],f=t}else f=c.length;const b=s.eq(0)?"":l;return u=u.replace(/(\d)(?=(\d{3})+$)/g,"$1,"),c=`${c}${"0".repeat(f)}`.substring(0,f),c===""?`${b}${u}`:`${b}${u}.${c}`}function a(e){return e.replace(/,/g,"")}function $(e,t){return new Intl.NumberFormat(t,{notation:"compact"}).format(e)}function p(e,t,r){let n=new i.Decimal(e);for(const o of t)n=n[o.operator](o.value);return r?.scale!=null&&(n=n.round(r.scale,r.roundingMode??i.ROUNDING_MODE.roundHalfUp)),n.toNumber()}function S(e,...t){let r=new i.Decimal(e);for(const n of t)r=r.add(n);return r.toNumber()}function M(e,...t){let r=new i.Decimal(e);for(const n of t)r=r.sub(n);return r.toNumber()}function O(e,...t){let r=new i.Decimal(e);for(const n of t)r=r.times(n);return r.toNumber()}function h(e,...t){let r=new i.Decimal(e);for(const n of t)r=r.div(n);return r.toNumber()}function m(e,t){return new i.Decimal(e).compareTo(t)}function U(e,t){return m(e,t)===0}function _(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,r){if(e==null)return null;const n=r??i.ROUNDING_MODE.roundHalfUp;switch(typeof e){case"number":return Number.isFinite(e)?new i.Decimal(e).round(t,n).toNumber():e;case"string":{if(d(e))return null;try{return new i.Decimal(e).round(t,n).toNumber()}catch{return Number.NaN}}default:return new i.Decimal(e).round(t,n).toNumber()}}function T(e,t){if(e==null)return"";if(d(e)||typeof e=="number"&&!Number.isFinite(e))return String(e);try{const r=new i.Decimal(e);return t?.scale!=null?r.toFixed(t.scale,t.roundingMode??i.ROUNDING_MODE.roundHalfUp):r.toString()}catch{return String(e)}}function B(e,t){if(e==null||d(e))switch(t?.empty){case"undefined":return;case"zero":return 0;default:return null}let r;switch(typeof e){case"number":r=e;break;case"bigint":r=Number(e);break;default:r=Number(a(e).trim())}if(Number.isNaN(r))switch(t?.nan){case"null":return null;case"undefined":return;default:return r}return r}function y(e,t){if(e==null||e==="")return[String(e),""];let r;switch(typeof e){case"number":if(Number.isNaN(e))return["NaN",""];r=new i.Decimal(e);break;case"string":try{r=new i.Decimal(a(e))}catch{return[e,""]}break;default:r=new i.Decimal(e)}const n=["B","KB","MB","GB","TB"];let o=0;for(;r.gte(1024)&&o<n.length-1;)r=r.div(1024),o++;const l=t?.scale??2,u=t?.roundingMode??i.ROUNDING_MODE.roundHalfUp;return t?.format?[g(r.toString(),l,u),n[o]]:[r.round(l,u).toString(),n[o]]}const F=Object.freeze(Object.defineProperty({__proto__:null,ROUNDING_MODE:i.ROUNDING_MODE,add:S,calc:p,compareTo:m,div:h,eq:U,formatBytes:y,formatComma:g,formatCompact:$,gt:E,gte:G,isLongValue:w,lt:_,lte:R,removeComma:a,round:I,sub:M,times:O,toNumber:B,toString:T},Symbol.toStringTag,{value:"Module"}));exports.add=S;exports.calc=p;exports.compareTo=m;exports.div=h;exports.eq=U;exports.formatBytes=y;exports.formatComma=g;exports.formatCompact=$;exports.gt=E;exports.gte=G;exports.isLongValue=w;exports.lt=_;exports.lte=R;exports.numberUtil=F;exports.removeComma=a;exports.round=I;exports.sub=M;exports.times=O;exports.toNumber=B;exports.toString=T;
2
+ //# sourceMappingURL=number-util-BrDEKYJo.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"number-util-BSra7lF5.cjs","sources":["../src/number-util.ts"],"sourcesContent":["import { Decimal, ROUNDING_MODE } from './decimal';\nimport type { NumberSource, RoundingMode } from './decimal';\n\nexport { ROUNDING_MODE };\nexport type { NumberSource, RoundingMode };\n\n// 64bit整数の範囲\nconst MIN_LONG = new Decimal('-9223372036854775808');\nconst MAX_LONG = new Decimal('9223372036854775807');\n\n/** 数値パターン */\nconst NUMBER_PATTERN = new RegExp('([\\+\\-]?)([0-9]*)[\\.]?([0-9]*)');\n\n/** 数値として解釈できる文字列のパターン(符号・小数点・指数表記) */\nconst NUMERIC_STRING_PATTERN = /^[+-]?(\\d+\\.?\\d*|\\.\\d+)(e[+-]?\\d+)?$/i;\n\n// 空文字・空白のみの文字列はtrueを返す\nconst isBlank = (value: unknown): value is string => typeof value === 'string' && value.trim() === '';\n\n/**\n * long(64bit)の範囲(-9223372036854775808〜9223372036854775807)の値か判定する\n * Javascriptのnumberの範囲は(-9007199254740991〜9007199254740991)である\n *\n * @param {string | bigint} value\n * @param {*} [options]\n * ├ minValue number 最小値を指定する場合(0を指定すると負数の場合falseを返す)\n * 不正な値を指定した場合は無視される(最小値を-9223372036854775808とみなす)\n * @returns {boolean}\n * @see Number.MAX_SAFE_INTEGER\n * @see Number.MIN_SAFE_INTEGER\n */\nexport function isLongValue(value: string | bigint, options?: {\n minValue?: number;\n}): boolean {\n if (value == null || isBlank(value)) {\n return false;\n }\n const min = Number.isFinite(options?.minValue) ? new Decimal(options!.minValue) : MIN_LONG;\n try {\n // -9223372036854775808 <= value <= 9223372036854775807\n return min.lte(value) && MAX_LONG.gte(value);\n } catch (error) {\n // 数値として解釈できない値\n return false;\n }\n}\n\n/**\n * 3桁ごとカンマ区切りした文字列を返す\n * 指数表記の値(1e21など)は通常の表記に展開してから区切る\n * 数値として解釈できない文字列はそのまま返し、NaN/Infinityは \"NaN\"/\"Infinity\"/\"-Infinity\" を返す\n *\n * @param {NumberSource | null | undefined} value 値\n * @param {number} [scale] 小数点桁数(補助桁数)\n * @param {RoundingMode} [roundingMode] 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {string}\n */\nexport function formatComma(value: NumberSource | null | undefined, scale?: number, roundingMode?: RoundingMode): string {\n if (value == null || value === '') {\n // 空文字を返却\n return '';\n }\n let strValue: string;\n switch (typeof value) {\n case 'number':\n if (!Number.isFinite(value)) {\n // \"NaN\" / \"Infinity\" / \"-Infinity\" を返却\n return String(value);\n }\n // toString()は1e21以上や1e-7以下を指数表記にするため、Decimalで通常の表記に展開する\n strValue = new Decimal(value).toString();\n break;\n case 'string':\n strValue = removeComma(value).trim();\n if (!NUMERIC_STRING_PATTERN.test(strValue)) {\n // 元の文字列を返却\n return value;\n }\n if (/e/i.test(strValue)) {\n // 指数表記を通常の表記に展開する。表示用に '+' を付け直す\n const plusSign = strValue.startsWith('+') ? '+' : '';\n strValue = `${plusSign}${new Decimal(strValue).toString()}`;\n }\n break;\n default:\n // bigintの場合\n strValue = value.toString();\n }\n const matches = NUMBER_PATTERN.exec(strValue) as RegExpExecArray;\n const sign = matches[1];\n let natural = matches[2] || '0';\n let decimal = matches[3];\n let dp: number;\n let decimalValue = new Decimal(`${sign === '-' ? '-' : ''}${natural}.${decimal}`);\n if (scale != null) {\n decimalValue = decimalValue.round(scale, roundingMode ?? ROUNDING_MODE.roundHalfUp);\n const roundedMatches = NUMBER_PATTERN.exec(decimalValue.toString()) as RegExpExecArray;\n natural = roundedMatches[2];\n decimal = roundedMatches[3];\n dp = scale;\n } else {\n dp = decimal.length;\n }\n // 丸めた結果がゼロになる場合('-0.001' を小数2桁にするなど)に \"-0.00\" とならないよう、丸めた後の値で判定する\n const displaySign = decimalValue.eq(0) ? '' : sign;\n natural = natural.replace(/(\\d)(?=(\\d{3})+$)/g, '$1,');\n decimal = `${decimal}${'0'.repeat(dp)}`.substring(0, dp);\n return decimal === ''\n ? `${displaySign}${natural}`\n : `${displaySign}${natural}.${decimal}`;\n}\n\n/**\n * カンマを除去する\n *\n * @param {string} value 入力値\n * @returns {string} カンマを取り除いた文字列\n */\nexport function removeComma(value: string): string {\n return value.replace(/,/g, '');\n}\n\n/**\n * 数値を表示ロケールの短縮表記にする。\n * en は 1.2K/3.4M/5.6B、ja は 12万/34億 のように単位が切り替わる。\n *\n * @param {number} value 値\n * @param {string} locale 表示ロケール(例 'ja' / 'en')\n * @returns {string} 短縮表記の文字列\n */\nexport function formatCompact(value: number, locale: string): string {\n return new Intl.NumberFormat(locale, { notation: 'compact' }).format(value);\n}\n\nexport type Operator = 'add' | 'sub' | 'times' | 'div';\n\nexport interface OperationItem {\n operator: Operator;\n value: NumberSource | null | undefined;\n}\n\n/**\n * 複数の演算をまとめて計算する\n * 計算途中は精度を保持し、最後にnumberへ変換する\n * この関数では四則演算の優先順位はなく、与えられた配列の順で計算を行う\n * * 優先順位やカッコの概念がある場合は事前に計算したうえでこの関数を利用する\n *\n * 例)\n * calc(\n * '123',\n * [\n * { operator: 'add', value: '123' },\n * { operator: 'sub', value: 100 },\n * { operator: 'times', value: 2 },\n * { operator: 'div', value: 3 }\n * ]\n * )\n * 123 + 123 = 246\n * 246 - 100 = 146\n * 146 * 2 = 292\n * 292 / 3 = 97.33333333\n *\n * null等の扱いは add / sub / times / div と同じ\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} initialValue\n * @param {OperationItem[]} operationItems\n * ├ operator: Operator\n * ├ value: NumberSource | null | undefined\n * @param {*} [options]\n * ├ scale 計算結果を丸める小数桁数。指定しない場合は丸めない\n * ├ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {number}\n */\nexport function calc(initialValue: NumberSource | null | undefined, operationItems: OperationItem[], options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n}): number {\n let decimal = new Decimal(initialValue);\n for (const item of operationItems) {\n decimal = decimal[item.operator](item.value);\n }\n if (options?.scale != null) {\n decimal = decimal.round(options.scale, options.roundingMode ?? ROUNDING_MODE.roundHalfUp);\n }\n return decimal.toNumber();\n}\n\n/**\n * 加算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果に影響しない\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function add(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.add(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 減算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果に影響しない\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function sub(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.sub(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 乗算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果は0になる\n * 元の値を保持したい場合は times(price, discount ?? 1) のようにフォールバック値を指定する\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function times(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.times(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 除算を行う\n * 割る値のnull/undefined/空文字/NaNは1と見做されるため、演算結果に影響しない\n * 割る値に0を指定した場合はゼロ除算エラーになる\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function div(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.div(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 2つの値を数値として比較する\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {-1 | 0 | 1} value1がvalue2より小さい場合は-1、等しい場合は0、大きい場合は1\n */\nexport function compareTo(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): -1 | 0 | 1 {\n return new Decimal(value1).compareTo(value2);\n}\n\n/**\n * 2つの値が数値として等しいかを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function eq(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return compareTo(value1, value2) === 0;\n}\n\n/**\n * value1がvalue2より小さいかを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function lt(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return compareTo(value1, value2) < 0;\n}\n\n/**\n * value1がvalue2以下かを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function lte(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return compareTo(value1, value2) <= 0;\n}\n\n/**\n * value1がvalue2より大きいかを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function gt(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return 0 < compareTo(value1, value2);\n}\n\n/**\n * value1がvalue2以上かを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function gte(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return 0 <= compareTo(value1, value2);\n}\n\n/**\n * 数値を指定した桁で丸める\n * null/undefined/空文字はnull、数値として解釈できない文字列はNaNを返す\n * NaN/Infinityはそのまま返す\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value\n * @param {number} scale\n * @param {RoundingMode} [roundingMode] デフォルトは 1: 四捨五入\n * 0 切り捨て\n * 1 四捨五入\n * 2 ISO丸め\n * 3 切り上げ\n * @returns {number | null}\n * @see ROUNDING_MODE\n */\nexport function round(\n value: NumberSource | null | undefined,\n scale: number,\n roundingMode?: RoundingMode\n): number | null {\n if (value == null) {\n return null;\n }\n const rm = roundingMode ?? ROUNDING_MODE.roundHalfUp;\n switch (typeof value) {\n case 'number':\n if (!Number.isFinite(value)) {\n // NaN/Infinityはそのまま返す\n return value;\n }\n return new Decimal(value).round(scale, rm).toNumber();\n case 'string': {\n if (isBlank(value)) {\n // 空文字は値なしとしてnullと同じ扱いにする\n return null;\n }\n try {\n return new Decimal(value).round(scale, rm).toNumber();\n } catch (error) {\n // 数値として解釈できない文字列\n return Number.NaN;\n }\n }\n default:\n return new Decimal(value).round(scale, rm).toNumber();\n }\n}\n\n/**\n * 数値文字列に変換する\n * 指数表記にはならず、通常の表記で返す\n * 数値として解釈できない値はString(value)を返す\n *\n * @param {NumberSource | null | undefined} value\n * @param {*} [options]\n * ├ scale 小数桁数。指定しない場合は丸めずにすべての桁を返す\n * ├ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {string}\n * @see ROUNDING_MODE\n */\nexport function toString(\n value: NumberSource | null | undefined,\n options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n }\n): string {\n if (value == null) {\n return '';\n }\n if (isBlank(value) || (typeof value === 'number' && !Number.isFinite(value))) {\n // 空文字・NaN・Infinityは数値として扱わない\n return String(value);\n }\n try {\n const decimal = new Decimal(value);\n return options?.scale != null\n ? decimal.toFixed(options.scale, options.roundingMode ?? ROUNDING_MODE.roundHalfUp)\n : decimal.toString();\n } catch (error) {\n return String(value);\n }\n}\n\n/**\n * 数値に変換する\n * null・undefined・空文字は未指定として null を返す\n * 文字列はカンマを除いてから変換し、数値として解釈できない場合は NaN を返す\n *\n * @param {NumberSource | null | undefined} value\n * @returns {number | null}\n */\nexport function toNumber(value: NumberSource | null | undefined): number | null {\n if (value == null || isBlank(value)) {\n return null;\n }\n switch (typeof value) {\n case 'number':\n return value;\n case 'bigint':\n return Number(value);\n default:\n return Number(removeComma(value).trim());\n }\n}\n\n/**\n * 渡されたバイト数値を桁数に応じてMB,GBなどに単位を変更する\n *\n * @param {NumberSource} bytes\n * @param {*} [options]\n * ┝ scale 小数以下桁数 デフォルト:2\n * ┝ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * ┝ format フォーマットするか。trueを指定した場合、3桁カンマ区切り+小数末尾0の桁揃え\n * @returns {[string, string]} 精度以下を丸めた数値(文字列)と単位をタプルで返す\n */\nexport function formatBytes(\n bytes: NumberSource,\n options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n format?: boolean;\n }\n): [string, string] {\n if (bytes == null || bytes === '') {\n return [String(bytes), ''];\n }\n let decimalValue: Decimal;\n switch (typeof bytes) {\n case 'number':\n if (Number.isNaN(bytes)) {\n // \"NaN\" を返却\n return ['NaN', ''];\n }\n decimalValue = new Decimal(bytes);\n break;\n case 'string':\n try {\n decimalValue = new Decimal(removeComma(bytes));\n } catch (error) {\n // 元の文字列を返却\n return [bytes, ''];\n }\n break;\n default:\n // bigintの場合\n decimalValue = new Decimal(bytes);\n }\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let i = 0;\n while (decimalValue.gte(1024) && i < units.length - 1) {\n decimalValue = decimalValue.div(1024);\n i++;\n }\n const scale = options?.scale ?? 2;\n const roundingMode = options?.roundingMode ?? ROUNDING_MODE.roundHalfUp;\n if (options?.format) {\n return [formatComma(decimalValue.toString(), scale, roundingMode), units[i]];\n }\n return [decimalValue.round(scale, roundingMode).toString(), units[i]];\n}\n"],"names":["MIN_LONG","Decimal","MAX_LONG","NUMBER_PATTERN","NUMERIC_STRING_PATTERN","isBlank","value","isLongValue","options","min","formatComma","scale","roundingMode","strValue","removeComma","matches","sign","natural","decimal","dp","decimalValue","ROUNDING_MODE","roundedMatches","displaySign","formatCompact","locale","calc","initialValue","operationItems","item","add","value1","value2","sub","times","div","compareTo","eq","lt","lte","gt","gte","round","rm","toString","toNumber","formatBytes","bytes","units","i"],"mappings":"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"}
1
+ {"version":3,"file":"number-util-BrDEKYJo.cjs","sources":["../src/number-util.ts"],"sourcesContent":["import { Decimal, ROUNDING_MODE } from './decimal';\nimport type { NumberSource, RoundingMode } from './decimal';\n\nexport { ROUNDING_MODE };\nexport type { NumberSource, RoundingMode };\n\n// 64bit整数の範囲\nconst MIN_LONG = new Decimal('-9223372036854775808');\nconst MAX_LONG = new Decimal('9223372036854775807');\n\n/** 数値パターン */\nconst NUMBER_PATTERN = new RegExp('([\\+\\-]?)([0-9]*)[\\.]?([0-9]*)');\n\n/** 数値として解釈できる文字列のパターン(符号・小数点・指数表記) */\nconst NUMERIC_STRING_PATTERN = /^[+-]?(\\d+\\.?\\d*|\\.\\d+)(e[+-]?\\d+)?$/i;\n\n// 空文字・空白のみの文字列はtrueを返す\nconst isBlank = (value: unknown): value is string => typeof value === 'string' && value.trim() === '';\n\n/**\n * long(64bit)の範囲(-9223372036854775808〜9223372036854775807)の値か判定する\n * Javascriptのnumberの範囲は(-9007199254740991〜9007199254740991)である\n *\n * @param {string | bigint} value\n * @param {*} [options]\n * ├ minValue number 最小値を指定する場合(0を指定すると負数の場合falseを返す)\n * 不正な値を指定した場合は無視される(最小値を-9223372036854775808とみなす)\n * @returns {boolean}\n * @see Number.MAX_SAFE_INTEGER\n * @see Number.MIN_SAFE_INTEGER\n */\nexport function isLongValue(value: string | bigint, options?: {\n minValue?: number;\n}): boolean {\n if (value == null || isBlank(value)) {\n return false;\n }\n const min = Number.isFinite(options?.minValue) ? new Decimal(options!.minValue) : MIN_LONG;\n try {\n // -9223372036854775808 <= value <= 9223372036854775807\n return min.lte(value) && MAX_LONG.gte(value);\n } catch (error) {\n // 数値として解釈できない値\n return false;\n }\n}\n\n/**\n * 3桁ごとカンマ区切りした文字列を返す\n * 指数表記の値(1e21など)は通常の表記に展開してから区切る\n * 数値として解釈できない文字列はそのまま返し、NaN/Infinityは \"NaN\"/\"Infinity\"/\"-Infinity\" を返す\n *\n * @param {NumberSource | null | undefined} value 値\n * @param {number} [scale] 小数点桁数(補助桁数)\n * @param {RoundingMode} [roundingMode] 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {string}\n */\nexport function formatComma(value: NumberSource | null | undefined, scale?: number, roundingMode?: RoundingMode): string {\n if (value == null || value === '') {\n // 空文字を返却\n return '';\n }\n let strValue: string;\n switch (typeof value) {\n case 'number':\n if (!Number.isFinite(value)) {\n // \"NaN\" / \"Infinity\" / \"-Infinity\" を返却\n return String(value);\n }\n // toString()は1e21以上や1e-7以下を指数表記にするため、Decimalで通常の表記に展開する\n strValue = new Decimal(value).toString();\n break;\n case 'string':\n strValue = removeComma(value).trim();\n if (!NUMERIC_STRING_PATTERN.test(strValue)) {\n // 元の文字列を返却\n return value;\n }\n if (/e/i.test(strValue)) {\n // 指数表記を通常の表記に展開する。表示用に '+' を付け直す\n const plusSign = strValue.startsWith('+') ? '+' : '';\n strValue = `${plusSign}${new Decimal(strValue).toString()}`;\n }\n break;\n default:\n // bigintの場合\n strValue = value.toString();\n }\n const matches = NUMBER_PATTERN.exec(strValue) as RegExpExecArray;\n const sign = matches[1];\n let natural = matches[2] || '0';\n let decimal = matches[3];\n let dp: number;\n let decimalValue = new Decimal(`${sign === '-' ? '-' : ''}${natural}.${decimal}`);\n if (scale != null) {\n decimalValue = decimalValue.round(scale, roundingMode ?? ROUNDING_MODE.roundHalfUp);\n const roundedMatches = NUMBER_PATTERN.exec(decimalValue.toString()) as RegExpExecArray;\n natural = roundedMatches[2];\n decimal = roundedMatches[3];\n dp = scale;\n } else {\n dp = decimal.length;\n }\n // 丸めた結果がゼロになる場合('-0.001' を小数2桁にするなど)に \"-0.00\" とならないよう、丸めた後の値で判定する\n const displaySign = decimalValue.eq(0) ? '' : sign;\n natural = natural.replace(/(\\d)(?=(\\d{3})+$)/g, '$1,');\n decimal = `${decimal}${'0'.repeat(dp)}`.substring(0, dp);\n return decimal === ''\n ? `${displaySign}${natural}`\n : `${displaySign}${natural}.${decimal}`;\n}\n\n/**\n * カンマを除去する\n *\n * @param {string} value 入力値\n * @returns {string} カンマを取り除いた文字列\n */\nexport function removeComma(value: string): string {\n return value.replace(/,/g, '');\n}\n\n/**\n * 数値を表示ロケールの短縮表記にする。\n * en は 1.2K/3.4M/5.6B、ja は 12万/34億 のように単位が切り替わる。\n *\n * @param {number} value 値\n * @param {string} locale 表示ロケール(例 'ja' / 'en')\n * @returns {string} 短縮表記の文字列\n */\nexport function formatCompact(value: number, locale: string): string {\n return new Intl.NumberFormat(locale, { notation: 'compact' }).format(value);\n}\n\nexport type Operator = 'add' | 'sub' | 'times' | 'div';\n\nexport interface OperationItem {\n operator: Operator;\n value: NumberSource | null | undefined;\n}\n\n/**\n * 複数の演算をまとめて計算する\n * 計算途中は精度を保持し、最後にnumberへ変換する\n * この関数では四則演算の優先順位はなく、与えられた配列の順で計算を行う\n * * 優先順位やカッコの概念がある場合は事前に計算したうえでこの関数を利用する\n *\n * 例)\n * calc(\n * '123',\n * [\n * { operator: 'add', value: '123' },\n * { operator: 'sub', value: 100 },\n * { operator: 'times', value: 2 },\n * { operator: 'div', value: 3 }\n * ]\n * )\n * 123 + 123 = 246\n * 246 - 100 = 146\n * 146 * 2 = 292\n * 292 / 3 = 97.33333333\n *\n * null等の扱いは add / sub / times / div と同じ\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} initialValue\n * @param {OperationItem[]} operationItems\n * ├ operator: Operator\n * ├ value: NumberSource | null | undefined\n * @param {*} [options]\n * ├ scale 計算結果を丸める小数桁数。指定しない場合は丸めない\n * ├ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {number}\n */\nexport function calc(initialValue: NumberSource | null | undefined, operationItems: OperationItem[], options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n}): number {\n let decimal = new Decimal(initialValue);\n for (const item of operationItems) {\n decimal = decimal[item.operator](item.value);\n }\n if (options?.scale != null) {\n decimal = decimal.round(options.scale, options.roundingMode ?? ROUNDING_MODE.roundHalfUp);\n }\n return decimal.toNumber();\n}\n\n/**\n * 加算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果に影響しない\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function add(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.add(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 減算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果に影響しない\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function sub(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.sub(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 乗算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果は0になる\n * 元の値を保持したい場合は times(price, discount ?? 1) のようにフォールバック値を指定する\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function times(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.times(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 除算を行う\n * 割る値のnull/undefined/空文字/NaNは1と見做されるため、演算結果に影響しない\n * 割る値に0を指定した場合はゼロ除算エラーになる\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function div(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.div(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 2つの値を数値として比較する\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {-1 | 0 | 1} value1がvalue2より小さい場合は-1、等しい場合は0、大きい場合は1\n */\nexport function compareTo(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): -1 | 0 | 1 {\n return new Decimal(value1).compareTo(value2);\n}\n\n/**\n * 2つの値が数値として等しいかを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function eq(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return compareTo(value1, value2) === 0;\n}\n\n/**\n * value1がvalue2より小さいかを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function lt(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return compareTo(value1, value2) < 0;\n}\n\n/**\n * value1がvalue2以下かを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function lte(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return compareTo(value1, value2) <= 0;\n}\n\n/**\n * value1がvalue2より大きいかを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function gt(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return 0 < compareTo(value1, value2);\n}\n\n/**\n * value1がvalue2以上かを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function gte(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return 0 <= compareTo(value1, value2);\n}\n\n/**\n * 数値を指定した桁で丸める\n * null/undefined/空文字はnull、数値として解釈できない文字列はNaNを返す\n * NaN/Infinityはそのまま返す\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value\n * @param {number} scale\n * @param {RoundingMode} [roundingMode] デフォルトは 1: 四捨五入\n * 0 切り捨て\n * 1 四捨五入\n * 2 ISO丸め\n * 3 切り上げ\n * @returns {number | null}\n * @see ROUNDING_MODE\n */\nexport function round(\n value: NumberSource | null | undefined,\n scale: number,\n roundingMode?: RoundingMode\n): number | null {\n if (value == null) {\n return null;\n }\n const rm = roundingMode ?? ROUNDING_MODE.roundHalfUp;\n switch (typeof value) {\n case 'number':\n if (!Number.isFinite(value)) {\n // NaN/Infinityはそのまま返す\n return value;\n }\n return new Decimal(value).round(scale, rm).toNumber();\n case 'string': {\n if (isBlank(value)) {\n // 空文字は値なしとしてnullと同じ扱いにする\n return null;\n }\n try {\n return new Decimal(value).round(scale, rm).toNumber();\n } catch (error) {\n // 数値として解釈できない文字列\n return Number.NaN;\n }\n }\n default:\n return new Decimal(value).round(scale, rm).toNumber();\n }\n}\n\n/**\n * 数値文字列に変換する\n * 指数表記にはならず、通常の表記で返す\n * 数値として解釈できない値はString(value)を返す\n *\n * @param {NumberSource | null | undefined} value\n * @param {*} [options]\n * ├ scale 小数桁数。指定しない場合は丸めずにすべての桁を返す\n * ├ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {string}\n * @see ROUNDING_MODE\n */\nexport function toString(\n value: NumberSource | null | undefined,\n options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n }\n): string {\n if (value == null) {\n return '';\n }\n if (isBlank(value) || (typeof value === 'number' && !Number.isFinite(value))) {\n // 空文字・NaN・Infinityは数値として扱わない\n return String(value);\n }\n try {\n const decimal = new Decimal(value);\n return options?.scale != null\n ? decimal.toFixed(options.scale, options.roundingMode ?? ROUNDING_MODE.roundHalfUp)\n : decimal.toString();\n } catch (error) {\n return String(value);\n }\n}\n\n/** toNumber のオプション */\nexport interface ToNumberOptions {\n /** 未指定(null・undefined・空白のみの文字列)のときに返す値。デフォルトは 'null' */\n empty?: 'null' | 'undefined' | 'zero';\n /** 数値として解釈できない(結果が NaN になる)ときに返す値。デフォルトは 'NaN' */\n nan?: 'NaN' | 'null' | 'undefined';\n}\n\n/** options.empty に応じた未指定時の戻り値の型。'zero' は number に含まれるので never */\ntype EmptyResult<O extends ToNumberOptions> = O extends { empty?: infer E }\n ? E extends 'undefined' ? undefined : E extends 'zero' ? never : null\n : null;\n\n/** options.nan に応じた変換不可時の戻り値の型。'NaN' は number に含まれるので never */\ntype NanResult<O extends ToNumberOptions> = O extends { nan?: infer N }\n ? N extends 'null' ? null : N extends 'undefined' ? undefined : never\n : never;\n\n/**\n * 数値に変換する\n * 文字列はカンマと前後の空白を除いてから変換する\n * null・undefined・空白のみの文字列は未指定として扱い、options.empty に応じて null(デフォルト)・undefined・0 のいずれかを返す\n * 数値として解釈できない場合は options.nan に応じて NaN(デフォルト)・null・undefined のいずれかを返す\n *\n * @param {NumberSource | null | undefined} value\n * @param {ToNumberOptions} [options]\n * ├ empty 未指定のときに返す値。'null'(デフォルト) | 'undefined' | 'zero'\n * └ nan 数値として解釈できないときに返す値。'NaN'(デフォルト) | 'null' | 'undefined'\n * @returns {number | EmptyResult<O> | NanResult<O>} 戻り値の型は options に連動する\n */\nexport function toNumber<O extends ToNumberOptions = Record<never, never>>(value: NumberSource | null | undefined, options?: O): number | EmptyResult<O> | NanResult<O> {\n type Result = number | EmptyResult<O> | NanResult<O>;\n if (value == null || isBlank(value)) {\n switch (options?.empty) {\n case 'undefined':\n return undefined as Result;\n case 'zero':\n return 0;\n default:\n return null as Result;\n }\n }\n let result: number;\n switch (typeof value) {\n case 'number':\n result = value;\n break;\n case 'bigint':\n result = Number(value);\n break;\n default:\n result = Number(removeComma(value).trim());\n }\n if (Number.isNaN(result)) {\n switch (options?.nan) {\n case 'null':\n return null as Result;\n case 'undefined':\n return undefined as Result;\n default:\n return result;\n }\n }\n return result;\n}\n\n/**\n * 渡されたバイト数値を桁数に応じてMB,GBなどに単位を変更する\n *\n * @param {NumberSource} bytes\n * @param {*} [options]\n * ┝ scale 小数以下桁数 デフォルト:2\n * ┝ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * ┝ format フォーマットするか。trueを指定した場合、3桁カンマ区切り+小数末尾0の桁揃え\n * @returns {[string, string]} 精度以下を丸めた数値(文字列)と単位をタプルで返す\n */\nexport function formatBytes(\n bytes: NumberSource,\n options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n format?: boolean;\n }\n): [string, string] {\n if (bytes == null || bytes === '') {\n return [String(bytes), ''];\n }\n let decimalValue: Decimal;\n switch (typeof bytes) {\n case 'number':\n if (Number.isNaN(bytes)) {\n // \"NaN\" を返却\n return ['NaN', ''];\n }\n decimalValue = new Decimal(bytes);\n break;\n case 'string':\n try {\n decimalValue = new Decimal(removeComma(bytes));\n } catch (error) {\n // 元の文字列を返却\n return [bytes, ''];\n }\n break;\n default:\n // bigintの場合\n decimalValue = new Decimal(bytes);\n }\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let i = 0;\n while (decimalValue.gte(1024) && i < units.length - 1) {\n decimalValue = decimalValue.div(1024);\n i++;\n }\n const scale = options?.scale ?? 2;\n const roundingMode = options?.roundingMode ?? ROUNDING_MODE.roundHalfUp;\n if (options?.format) {\n return [formatComma(decimalValue.toString(), scale, roundingMode), units[i]];\n }\n return [decimalValue.round(scale, roundingMode).toString(), units[i]];\n}\n"],"names":["MIN_LONG","Decimal","MAX_LONG","NUMBER_PATTERN","NUMERIC_STRING_PATTERN","isBlank","value","isLongValue","options","min","formatComma","scale","roundingMode","strValue","removeComma","matches","sign","natural","decimal","dp","decimalValue","ROUNDING_MODE","roundedMatches","displaySign","formatCompact","locale","calc","initialValue","operationItems","item","add","value1","value2","sub","times","div","compareTo","eq","lt","lte","gt","gte","round","rm","toString","toNumber","result","formatBytes","bytes","units","i"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import { Decimal as o, ROUNDING_MODE as s } from "./decimal.js";
2
- const S = new o("-9223372036854775808"), h = new o("9223372036854775807"), w = new RegExp("([+-]?)([0-9]*)[.]?([0-9]*)"), $ = /^[+-]?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i, d = (n) => typeof n == "string" && n.trim() === "";
1
+ import { Decimal as u, ROUNDING_MODE as a } from "./decimal.js";
2
+ const S = new u("-9223372036854775808"), h = new u("9223372036854775807"), w = new RegExp("([+-]?)([0-9]*)[.]?([0-9]*)"), $ = /^[+-]?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i, d = (n) => typeof n == "string" && n.trim() === "";
3
3
  function M(n, r) {
4
4
  if (n == null || d(n))
5
5
  return !1;
6
- const t = Number.isFinite(r?.minValue) ? new o(r.minValue) : S;
6
+ const t = Number.isFinite(r?.minValue) ? new u(r.minValue) : S;
7
7
  try {
8
8
  return t.lte(n) && h.gte(n);
9
9
  } catch {
@@ -18,26 +18,26 @@ function p(n, r, t) {
18
18
  case "number":
19
19
  if (!Number.isFinite(n))
20
20
  return String(n);
21
- e = new o(n).toString();
21
+ e = new u(n).toString();
22
22
  break;
23
23
  case "string":
24
24
  if (e = g(n).trim(), !$.test(e))
25
25
  return n;
26
- /e/i.test(e) && (e = `${e.startsWith("+") ? "+" : ""}${new o(e).toString()}`);
26
+ /e/i.test(e) && (e = `${e.startsWith("+") ? "+" : ""}${new u(e).toString()}`);
27
27
  break;
28
28
  default:
29
29
  e = n.toString();
30
30
  }
31
31
  const i = w.exec(e), f = i[1];
32
- let u = i[2] || "0", c = i[3], m, l = new o(`${f === "-" ? "-" : ""}${u}.${c}`);
32
+ let o = i[2] || "0", c = i[3], l, m = new u(`${f === "-" ? "-" : ""}${o}.${c}`);
33
33
  if (r != null) {
34
- l = l.round(r, t ?? s.roundHalfUp);
35
- const N = w.exec(l.toString());
36
- u = N[2], c = N[3], m = r;
34
+ m = m.round(r, t ?? a.roundHalfUp);
35
+ const N = w.exec(m.toString());
36
+ o = N[2], c = N[3], l = r;
37
37
  } else
38
- m = c.length;
39
- const b = l.eq(0) ? "" : f;
40
- return u = u.replace(/(\d)(?=(\d{3})+$)/g, "$1,"), c = `${c}${"0".repeat(m)}`.substring(0, m), c === "" ? `${b}${u}` : `${b}${u}.${c}`;
38
+ l = c.length;
39
+ const b = m.eq(0) ? "" : f;
40
+ return o = o.replace(/(\d)(?=(\d{3})+$)/g, "$1,"), c = `${c}${"0".repeat(l)}`.substring(0, l), c === "" ? `${b}${o}` : `${b}${o}.${c}`;
41
41
  }
42
42
  function g(n) {
43
43
  return n.replace(/,/g, "");
@@ -46,71 +46,71 @@ function _(n, r) {
46
46
  return new Intl.NumberFormat(r, { notation: "compact" }).format(n);
47
47
  }
48
48
  function T(n, r, t) {
49
- let e = new o(n);
49
+ let e = new u(n);
50
50
  for (const i of r)
51
51
  e = e[i.operator](i.value);
52
- return t?.scale != null && (e = e.round(t.scale, t.roundingMode ?? s.roundHalfUp)), e.toNumber();
52
+ return t?.scale != null && (e = e.round(t.scale, t.roundingMode ?? a.roundHalfUp)), e.toNumber();
53
53
  }
54
54
  function U(n, ...r) {
55
- let t = new o(n);
55
+ let t = new u(n);
56
56
  for (const e of r)
57
57
  t = t.add(e);
58
58
  return t.toNumber();
59
59
  }
60
- function B(n, ...r) {
61
- let t = new o(n);
60
+ function k(n, ...r) {
61
+ let t = new u(n);
62
62
  for (const e of r)
63
63
  t = t.sub(e);
64
64
  return t.toNumber();
65
65
  }
66
- function R(n, ...r) {
67
- let t = new o(n);
66
+ function B(n, ...r) {
67
+ let t = new u(n);
68
68
  for (const e of r)
69
69
  t = t.times(e);
70
70
  return t.toNumber();
71
71
  }
72
- function k(n, ...r) {
73
- let t = new o(n);
72
+ function y(n, ...r) {
73
+ let t = new u(n);
74
74
  for (const e of r)
75
75
  t = t.div(e);
76
76
  return t.toNumber();
77
77
  }
78
- function a(n, r) {
79
- return new o(n).compareTo(r);
78
+ function s(n, r) {
79
+ return new u(n).compareTo(r);
80
80
  }
81
- function y(n, r) {
82
- return a(n, r) === 0;
81
+ function R(n, r) {
82
+ return s(n, r) === 0;
83
83
  }
84
84
  function E(n, r) {
85
- return a(n, r) < 0;
85
+ return s(n, r) < 0;
86
86
  }
87
87
  function F(n, r) {
88
- return a(n, r) <= 0;
88
+ return s(n, r) <= 0;
89
89
  }
90
90
  function O(n, r) {
91
- return 0 < a(n, r);
91
+ return 0 < s(n, r);
92
92
  }
93
93
  function V(n, r) {
94
- return 0 <= a(n, r);
94
+ return 0 <= s(n, r);
95
95
  }
96
96
  function x(n, r, t) {
97
97
  if (n == null)
98
98
  return null;
99
- const e = t ?? s.roundHalfUp;
99
+ const e = t ?? a.roundHalfUp;
100
100
  switch (typeof n) {
101
101
  case "number":
102
- return Number.isFinite(n) ? new o(n).round(r, e).toNumber() : n;
102
+ return Number.isFinite(n) ? new u(n).round(r, e).toNumber() : n;
103
103
  case "string": {
104
104
  if (d(n))
105
105
  return null;
106
106
  try {
107
- return new o(n).round(r, e).toNumber();
107
+ return new u(n).round(r, e).toNumber();
108
108
  } catch {
109
109
  return Number.NaN;
110
110
  }
111
111
  }
112
112
  default:
113
- return new o(n).round(r, e).toNumber();
113
+ return new u(n).round(r, e).toNumber();
114
114
  }
115
115
  }
116
116
  function G(n, r) {
@@ -119,23 +119,43 @@ function G(n, r) {
119
119
  if (d(n) || typeof n == "number" && !Number.isFinite(n))
120
120
  return String(n);
121
121
  try {
122
- const t = new o(n);
123
- return r?.scale != null ? t.toFixed(r.scale, r.roundingMode ?? s.roundHalfUp) : t.toString();
122
+ const t = new u(n);
123
+ return r?.scale != null ? t.toFixed(r.scale, r.roundingMode ?? a.roundHalfUp) : t.toString();
124
124
  } catch {
125
125
  return String(n);
126
126
  }
127
127
  }
128
- function H(n) {
128
+ function H(n, r) {
129
129
  if (n == null || d(n))
130
- return null;
130
+ switch (r?.empty) {
131
+ case "undefined":
132
+ return;
133
+ case "zero":
134
+ return 0;
135
+ default:
136
+ return null;
137
+ }
138
+ let t;
131
139
  switch (typeof n) {
132
140
  case "number":
133
- return n;
141
+ t = n;
142
+ break;
134
143
  case "bigint":
135
- return Number(n);
144
+ t = Number(n);
145
+ break;
136
146
  default:
137
- return Number(g(n).trim());
147
+ t = Number(g(n).trim());
138
148
  }
149
+ if (Number.isNaN(t))
150
+ switch (r?.nan) {
151
+ case "null":
152
+ return null;
153
+ case "undefined":
154
+ return;
155
+ default:
156
+ return t;
157
+ }
158
+ return t;
139
159
  }
140
160
  function I(n, r) {
141
161
  if (n == null || n === "")
@@ -145,33 +165,33 @@ function I(n, r) {
145
165
  case "number":
146
166
  if (Number.isNaN(n))
147
167
  return ["NaN", ""];
148
- t = new o(n);
168
+ t = new u(n);
149
169
  break;
150
170
  case "string":
151
171
  try {
152
- t = new o(g(n));
172
+ t = new u(g(n));
153
173
  } catch {
154
174
  return [n, ""];
155
175
  }
156
176
  break;
157
177
  default:
158
- t = new o(n);
178
+ t = new u(n);
159
179
  }
160
180
  const e = ["B", "KB", "MB", "GB", "TB"];
161
181
  let i = 0;
162
182
  for (; t.gte(1024) && i < e.length - 1; )
163
183
  t = t.div(1024), i++;
164
- const f = r?.scale ?? 2, u = r?.roundingMode ?? s.roundHalfUp;
165
- return r?.format ? [p(t.toString(), f, u), e[i]] : [t.round(f, u).toString(), e[i]];
184
+ const f = r?.scale ?? 2, o = r?.roundingMode ?? a.roundHalfUp;
185
+ return r?.format ? [p(t.toString(), f, o), e[i]] : [t.round(f, o).toString(), e[i]];
166
186
  }
167
187
  const j = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
168
188
  __proto__: null,
169
- ROUNDING_MODE: s,
189
+ ROUNDING_MODE: a,
170
190
  add: U,
171
191
  calc: T,
172
- compareTo: a,
173
- div: k,
174
- eq: y,
192
+ compareTo: s,
193
+ div: y,
194
+ eq: R,
175
195
  formatBytes: I,
176
196
  formatComma: p,
177
197
  formatCompact: _,
@@ -182,17 +202,17 @@ const j = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
182
202
  lte: F,
183
203
  removeComma: g,
184
204
  round: x,
185
- sub: B,
186
- times: R,
205
+ sub: k,
206
+ times: B,
187
207
  toNumber: H,
188
208
  toString: G
189
209
  }, Symbol.toStringTag, { value: "Module" }));
190
210
  export {
191
211
  U as a,
192
- a as b,
212
+ s as b,
193
213
  T as c,
194
- k as d,
195
- y as e,
214
+ y as d,
215
+ R as e,
196
216
  I as f,
197
217
  p as g,
198
218
  _ as h,
@@ -206,7 +226,7 @@ export {
206
226
  H as p,
207
227
  G as q,
208
228
  g as r,
209
- B as s,
210
- R as t
229
+ k as s,
230
+ B as t
211
231
  };
212
- //# sourceMappingURL=number-util-DXjPN_-P.js.map
232
+ //# sourceMappingURL=number-util-Wpubbqr4.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"number-util-DXjPN_-P.js","sources":["../src/number-util.ts"],"sourcesContent":["import { Decimal, ROUNDING_MODE } from './decimal';\nimport type { NumberSource, RoundingMode } from './decimal';\n\nexport { ROUNDING_MODE };\nexport type { NumberSource, RoundingMode };\n\n// 64bit整数の範囲\nconst MIN_LONG = new Decimal('-9223372036854775808');\nconst MAX_LONG = new Decimal('9223372036854775807');\n\n/** 数値パターン */\nconst NUMBER_PATTERN = new RegExp('([\\+\\-]?)([0-9]*)[\\.]?([0-9]*)');\n\n/** 数値として解釈できる文字列のパターン(符号・小数点・指数表記) */\nconst NUMERIC_STRING_PATTERN = /^[+-]?(\\d+\\.?\\d*|\\.\\d+)(e[+-]?\\d+)?$/i;\n\n// 空文字・空白のみの文字列はtrueを返す\nconst isBlank = (value: unknown): value is string => typeof value === 'string' && value.trim() === '';\n\n/**\n * long(64bit)の範囲(-9223372036854775808〜9223372036854775807)の値か判定する\n * Javascriptのnumberの範囲は(-9007199254740991〜9007199254740991)である\n *\n * @param {string | bigint} value\n * @param {*} [options]\n * ├ minValue number 最小値を指定する場合(0を指定すると負数の場合falseを返す)\n * 不正な値を指定した場合は無視される(最小値を-9223372036854775808とみなす)\n * @returns {boolean}\n * @see Number.MAX_SAFE_INTEGER\n * @see Number.MIN_SAFE_INTEGER\n */\nexport function isLongValue(value: string | bigint, options?: {\n minValue?: number;\n}): boolean {\n if (value == null || isBlank(value)) {\n return false;\n }\n const min = Number.isFinite(options?.minValue) ? new Decimal(options!.minValue) : MIN_LONG;\n try {\n // -9223372036854775808 <= value <= 9223372036854775807\n return min.lte(value) && MAX_LONG.gte(value);\n } catch (error) {\n // 数値として解釈できない値\n return false;\n }\n}\n\n/**\n * 3桁ごとカンマ区切りした文字列を返す\n * 指数表記の値(1e21など)は通常の表記に展開してから区切る\n * 数値として解釈できない文字列はそのまま返し、NaN/Infinityは \"NaN\"/\"Infinity\"/\"-Infinity\" を返す\n *\n * @param {NumberSource | null | undefined} value 値\n * @param {number} [scale] 小数点桁数(補助桁数)\n * @param {RoundingMode} [roundingMode] 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {string}\n */\nexport function formatComma(value: NumberSource | null | undefined, scale?: number, roundingMode?: RoundingMode): string {\n if (value == null || value === '') {\n // 空文字を返却\n return '';\n }\n let strValue: string;\n switch (typeof value) {\n case 'number':\n if (!Number.isFinite(value)) {\n // \"NaN\" / \"Infinity\" / \"-Infinity\" を返却\n return String(value);\n }\n // toString()は1e21以上や1e-7以下を指数表記にするため、Decimalで通常の表記に展開する\n strValue = new Decimal(value).toString();\n break;\n case 'string':\n strValue = removeComma(value).trim();\n if (!NUMERIC_STRING_PATTERN.test(strValue)) {\n // 元の文字列を返却\n return value;\n }\n if (/e/i.test(strValue)) {\n // 指数表記を通常の表記に展開する。表示用に '+' を付け直す\n const plusSign = strValue.startsWith('+') ? '+' : '';\n strValue = `${plusSign}${new Decimal(strValue).toString()}`;\n }\n break;\n default:\n // bigintの場合\n strValue = value.toString();\n }\n const matches = NUMBER_PATTERN.exec(strValue) as RegExpExecArray;\n const sign = matches[1];\n let natural = matches[2] || '0';\n let decimal = matches[3];\n let dp: number;\n let decimalValue = new Decimal(`${sign === '-' ? '-' : ''}${natural}.${decimal}`);\n if (scale != null) {\n decimalValue = decimalValue.round(scale, roundingMode ?? ROUNDING_MODE.roundHalfUp);\n const roundedMatches = NUMBER_PATTERN.exec(decimalValue.toString()) as RegExpExecArray;\n natural = roundedMatches[2];\n decimal = roundedMatches[3];\n dp = scale;\n } else {\n dp = decimal.length;\n }\n // 丸めた結果がゼロになる場合('-0.001' を小数2桁にするなど)に \"-0.00\" とならないよう、丸めた後の値で判定する\n const displaySign = decimalValue.eq(0) ? '' : sign;\n natural = natural.replace(/(\\d)(?=(\\d{3})+$)/g, '$1,');\n decimal = `${decimal}${'0'.repeat(dp)}`.substring(0, dp);\n return decimal === ''\n ? `${displaySign}${natural}`\n : `${displaySign}${natural}.${decimal}`;\n}\n\n/**\n * カンマを除去する\n *\n * @param {string} value 入力値\n * @returns {string} カンマを取り除いた文字列\n */\nexport function removeComma(value: string): string {\n return value.replace(/,/g, '');\n}\n\n/**\n * 数値を表示ロケールの短縮表記にする。\n * en は 1.2K/3.4M/5.6B、ja は 12万/34億 のように単位が切り替わる。\n *\n * @param {number} value 値\n * @param {string} locale 表示ロケール(例 'ja' / 'en')\n * @returns {string} 短縮表記の文字列\n */\nexport function formatCompact(value: number, locale: string): string {\n return new Intl.NumberFormat(locale, { notation: 'compact' }).format(value);\n}\n\nexport type Operator = 'add' | 'sub' | 'times' | 'div';\n\nexport interface OperationItem {\n operator: Operator;\n value: NumberSource | null | undefined;\n}\n\n/**\n * 複数の演算をまとめて計算する\n * 計算途中は精度を保持し、最後にnumberへ変換する\n * この関数では四則演算の優先順位はなく、与えられた配列の順で計算を行う\n * * 優先順位やカッコの概念がある場合は事前に計算したうえでこの関数を利用する\n *\n * 例)\n * calc(\n * '123',\n * [\n * { operator: 'add', value: '123' },\n * { operator: 'sub', value: 100 },\n * { operator: 'times', value: 2 },\n * { operator: 'div', value: 3 }\n * ]\n * )\n * 123 + 123 = 246\n * 246 - 100 = 146\n * 146 * 2 = 292\n * 292 / 3 = 97.33333333\n *\n * null等の扱いは add / sub / times / div と同じ\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} initialValue\n * @param {OperationItem[]} operationItems\n * ├ operator: Operator\n * ├ value: NumberSource | null | undefined\n * @param {*} [options]\n * ├ scale 計算結果を丸める小数桁数。指定しない場合は丸めない\n * ├ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {number}\n */\nexport function calc(initialValue: NumberSource | null | undefined, operationItems: OperationItem[], options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n}): number {\n let decimal = new Decimal(initialValue);\n for (const item of operationItems) {\n decimal = decimal[item.operator](item.value);\n }\n if (options?.scale != null) {\n decimal = decimal.round(options.scale, options.roundingMode ?? ROUNDING_MODE.roundHalfUp);\n }\n return decimal.toNumber();\n}\n\n/**\n * 加算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果に影響しない\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function add(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.add(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 減算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果に影響しない\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function sub(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.sub(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 乗算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果は0になる\n * 元の値を保持したい場合は times(price, discount ?? 1) のようにフォールバック値を指定する\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function times(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.times(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 除算を行う\n * 割る値のnull/undefined/空文字/NaNは1と見做されるため、演算結果に影響しない\n * 割る値に0を指定した場合はゼロ除算エラーになる\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function div(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.div(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 2つの値を数値として比較する\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {-1 | 0 | 1} value1がvalue2より小さい場合は-1、等しい場合は0、大きい場合は1\n */\nexport function compareTo(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): -1 | 0 | 1 {\n return new Decimal(value1).compareTo(value2);\n}\n\n/**\n * 2つの値が数値として等しいかを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function eq(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return compareTo(value1, value2) === 0;\n}\n\n/**\n * value1がvalue2より小さいかを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function lt(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return compareTo(value1, value2) < 0;\n}\n\n/**\n * value1がvalue2以下かを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function lte(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return compareTo(value1, value2) <= 0;\n}\n\n/**\n * value1がvalue2より大きいかを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function gt(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return 0 < compareTo(value1, value2);\n}\n\n/**\n * value1がvalue2以上かを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function gte(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return 0 <= compareTo(value1, value2);\n}\n\n/**\n * 数値を指定した桁で丸める\n * null/undefined/空文字はnull、数値として解釈できない文字列はNaNを返す\n * NaN/Infinityはそのまま返す\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value\n * @param {number} scale\n * @param {RoundingMode} [roundingMode] デフォルトは 1: 四捨五入\n * 0 切り捨て\n * 1 四捨五入\n * 2 ISO丸め\n * 3 切り上げ\n * @returns {number | null}\n * @see ROUNDING_MODE\n */\nexport function round(\n value: NumberSource | null | undefined,\n scale: number,\n roundingMode?: RoundingMode\n): number | null {\n if (value == null) {\n return null;\n }\n const rm = roundingMode ?? ROUNDING_MODE.roundHalfUp;\n switch (typeof value) {\n case 'number':\n if (!Number.isFinite(value)) {\n // NaN/Infinityはそのまま返す\n return value;\n }\n return new Decimal(value).round(scale, rm).toNumber();\n case 'string': {\n if (isBlank(value)) {\n // 空文字は値なしとしてnullと同じ扱いにする\n return null;\n }\n try {\n return new Decimal(value).round(scale, rm).toNumber();\n } catch (error) {\n // 数値として解釈できない文字列\n return Number.NaN;\n }\n }\n default:\n return new Decimal(value).round(scale, rm).toNumber();\n }\n}\n\n/**\n * 数値文字列に変換する\n * 指数表記にはならず、通常の表記で返す\n * 数値として解釈できない値はString(value)を返す\n *\n * @param {NumberSource | null | undefined} value\n * @param {*} [options]\n * ├ scale 小数桁数。指定しない場合は丸めずにすべての桁を返す\n * ├ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {string}\n * @see ROUNDING_MODE\n */\nexport function toString(\n value: NumberSource | null | undefined,\n options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n }\n): string {\n if (value == null) {\n return '';\n }\n if (isBlank(value) || (typeof value === 'number' && !Number.isFinite(value))) {\n // 空文字・NaN・Infinityは数値として扱わない\n return String(value);\n }\n try {\n const decimal = new Decimal(value);\n return options?.scale != null\n ? decimal.toFixed(options.scale, options.roundingMode ?? ROUNDING_MODE.roundHalfUp)\n : decimal.toString();\n } catch (error) {\n return String(value);\n }\n}\n\n/**\n * 数値に変換する\n * null・undefined・空文字は未指定として null を返す\n * 文字列はカンマを除いてから変換し、数値として解釈できない場合は NaN を返す\n *\n * @param {NumberSource | null | undefined} value\n * @returns {number | null}\n */\nexport function toNumber(value: NumberSource | null | undefined): number | null {\n if (value == null || isBlank(value)) {\n return null;\n }\n switch (typeof value) {\n case 'number':\n return value;\n case 'bigint':\n return Number(value);\n default:\n return Number(removeComma(value).trim());\n }\n}\n\n/**\n * 渡されたバイト数値を桁数に応じてMB,GBなどに単位を変更する\n *\n * @param {NumberSource} bytes\n * @param {*} [options]\n * ┝ scale 小数以下桁数 デフォルト:2\n * ┝ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * ┝ format フォーマットするか。trueを指定した場合、3桁カンマ区切り+小数末尾0の桁揃え\n * @returns {[string, string]} 精度以下を丸めた数値(文字列)と単位をタプルで返す\n */\nexport function formatBytes(\n bytes: NumberSource,\n options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n format?: boolean;\n }\n): [string, string] {\n if (bytes == null || bytes === '') {\n return [String(bytes), ''];\n }\n let decimalValue: Decimal;\n switch (typeof bytes) {\n case 'number':\n if (Number.isNaN(bytes)) {\n // \"NaN\" を返却\n return ['NaN', ''];\n }\n decimalValue = new Decimal(bytes);\n break;\n case 'string':\n try {\n decimalValue = new Decimal(removeComma(bytes));\n } catch (error) {\n // 元の文字列を返却\n return [bytes, ''];\n }\n break;\n default:\n // bigintの場合\n decimalValue = new Decimal(bytes);\n }\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let i = 0;\n while (decimalValue.gte(1024) && i < units.length - 1) {\n decimalValue = decimalValue.div(1024);\n i++;\n }\n const scale = options?.scale ?? 2;\n const roundingMode = options?.roundingMode ?? ROUNDING_MODE.roundHalfUp;\n if (options?.format) {\n return [formatComma(decimalValue.toString(), scale, roundingMode), units[i]];\n }\n return [decimalValue.round(scale, roundingMode).toString(), units[i]];\n}\n"],"names":["MIN_LONG","Decimal","MAX_LONG","NUMBER_PATTERN","NUMERIC_STRING_PATTERN","isBlank","value","isLongValue","options","min","formatComma","scale","roundingMode","strValue","removeComma","matches","sign","natural","decimal","dp","decimalValue","ROUNDING_MODE","roundedMatches","displaySign","formatCompact","locale","calc","initialValue","operationItems","item","add","value1","value2","sub","times","div","compareTo","eq","lt","lte","gt","gte","round","rm","toString","toNumber","formatBytes","bytes","units"],"mappings":"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"}
1
+ {"version":3,"file":"number-util-Wpubbqr4.js","sources":["../src/number-util.ts"],"sourcesContent":["import { Decimal, ROUNDING_MODE } from './decimal';\nimport type { NumberSource, RoundingMode } from './decimal';\n\nexport { ROUNDING_MODE };\nexport type { NumberSource, RoundingMode };\n\n// 64bit整数の範囲\nconst MIN_LONG = new Decimal('-9223372036854775808');\nconst MAX_LONG = new Decimal('9223372036854775807');\n\n/** 数値パターン */\nconst NUMBER_PATTERN = new RegExp('([\\+\\-]?)([0-9]*)[\\.]?([0-9]*)');\n\n/** 数値として解釈できる文字列のパターン(符号・小数点・指数表記) */\nconst NUMERIC_STRING_PATTERN = /^[+-]?(\\d+\\.?\\d*|\\.\\d+)(e[+-]?\\d+)?$/i;\n\n// 空文字・空白のみの文字列はtrueを返す\nconst isBlank = (value: unknown): value is string => typeof value === 'string' && value.trim() === '';\n\n/**\n * long(64bit)の範囲(-9223372036854775808〜9223372036854775807)の値か判定する\n * Javascriptのnumberの範囲は(-9007199254740991〜9007199254740991)である\n *\n * @param {string | bigint} value\n * @param {*} [options]\n * ├ minValue number 最小値を指定する場合(0を指定すると負数の場合falseを返す)\n * 不正な値を指定した場合は無視される(最小値を-9223372036854775808とみなす)\n * @returns {boolean}\n * @see Number.MAX_SAFE_INTEGER\n * @see Number.MIN_SAFE_INTEGER\n */\nexport function isLongValue(value: string | bigint, options?: {\n minValue?: number;\n}): boolean {\n if (value == null || isBlank(value)) {\n return false;\n }\n const min = Number.isFinite(options?.minValue) ? new Decimal(options!.minValue) : MIN_LONG;\n try {\n // -9223372036854775808 <= value <= 9223372036854775807\n return min.lte(value) && MAX_LONG.gte(value);\n } catch (error) {\n // 数値として解釈できない値\n return false;\n }\n}\n\n/**\n * 3桁ごとカンマ区切りした文字列を返す\n * 指数表記の値(1e21など)は通常の表記に展開してから区切る\n * 数値として解釈できない文字列はそのまま返し、NaN/Infinityは \"NaN\"/\"Infinity\"/\"-Infinity\" を返す\n *\n * @param {NumberSource | null | undefined} value 値\n * @param {number} [scale] 小数点桁数(補助桁数)\n * @param {RoundingMode} [roundingMode] 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {string}\n */\nexport function formatComma(value: NumberSource | null | undefined, scale?: number, roundingMode?: RoundingMode): string {\n if (value == null || value === '') {\n // 空文字を返却\n return '';\n }\n let strValue: string;\n switch (typeof value) {\n case 'number':\n if (!Number.isFinite(value)) {\n // \"NaN\" / \"Infinity\" / \"-Infinity\" を返却\n return String(value);\n }\n // toString()は1e21以上や1e-7以下を指数表記にするため、Decimalで通常の表記に展開する\n strValue = new Decimal(value).toString();\n break;\n case 'string':\n strValue = removeComma(value).trim();\n if (!NUMERIC_STRING_PATTERN.test(strValue)) {\n // 元の文字列を返却\n return value;\n }\n if (/e/i.test(strValue)) {\n // 指数表記を通常の表記に展開する。表示用に '+' を付け直す\n const plusSign = strValue.startsWith('+') ? '+' : '';\n strValue = `${plusSign}${new Decimal(strValue).toString()}`;\n }\n break;\n default:\n // bigintの場合\n strValue = value.toString();\n }\n const matches = NUMBER_PATTERN.exec(strValue) as RegExpExecArray;\n const sign = matches[1];\n let natural = matches[2] || '0';\n let decimal = matches[3];\n let dp: number;\n let decimalValue = new Decimal(`${sign === '-' ? '-' : ''}${natural}.${decimal}`);\n if (scale != null) {\n decimalValue = decimalValue.round(scale, roundingMode ?? ROUNDING_MODE.roundHalfUp);\n const roundedMatches = NUMBER_PATTERN.exec(decimalValue.toString()) as RegExpExecArray;\n natural = roundedMatches[2];\n decimal = roundedMatches[3];\n dp = scale;\n } else {\n dp = decimal.length;\n }\n // 丸めた結果がゼロになる場合('-0.001' を小数2桁にするなど)に \"-0.00\" とならないよう、丸めた後の値で判定する\n const displaySign = decimalValue.eq(0) ? '' : sign;\n natural = natural.replace(/(\\d)(?=(\\d{3})+$)/g, '$1,');\n decimal = `${decimal}${'0'.repeat(dp)}`.substring(0, dp);\n return decimal === ''\n ? `${displaySign}${natural}`\n : `${displaySign}${natural}.${decimal}`;\n}\n\n/**\n * カンマを除去する\n *\n * @param {string} value 入力値\n * @returns {string} カンマを取り除いた文字列\n */\nexport function removeComma(value: string): string {\n return value.replace(/,/g, '');\n}\n\n/**\n * 数値を表示ロケールの短縮表記にする。\n * en は 1.2K/3.4M/5.6B、ja は 12万/34億 のように単位が切り替わる。\n *\n * @param {number} value 値\n * @param {string} locale 表示ロケール(例 'ja' / 'en')\n * @returns {string} 短縮表記の文字列\n */\nexport function formatCompact(value: number, locale: string): string {\n return new Intl.NumberFormat(locale, { notation: 'compact' }).format(value);\n}\n\nexport type Operator = 'add' | 'sub' | 'times' | 'div';\n\nexport interface OperationItem {\n operator: Operator;\n value: NumberSource | null | undefined;\n}\n\n/**\n * 複数の演算をまとめて計算する\n * 計算途中は精度を保持し、最後にnumberへ変換する\n * この関数では四則演算の優先順位はなく、与えられた配列の順で計算を行う\n * * 優先順位やカッコの概念がある場合は事前に計算したうえでこの関数を利用する\n *\n * 例)\n * calc(\n * '123',\n * [\n * { operator: 'add', value: '123' },\n * { operator: 'sub', value: 100 },\n * { operator: 'times', value: 2 },\n * { operator: 'div', value: 3 }\n * ]\n * )\n * 123 + 123 = 246\n * 246 - 100 = 146\n * 146 * 2 = 292\n * 292 / 3 = 97.33333333\n *\n * null等の扱いは add / sub / times / div と同じ\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} initialValue\n * @param {OperationItem[]} operationItems\n * ├ operator: Operator\n * ├ value: NumberSource | null | undefined\n * @param {*} [options]\n * ├ scale 計算結果を丸める小数桁数。指定しない場合は丸めない\n * ├ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {number}\n */\nexport function calc(initialValue: NumberSource | null | undefined, operationItems: OperationItem[], options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n}): number {\n let decimal = new Decimal(initialValue);\n for (const item of operationItems) {\n decimal = decimal[item.operator](item.value);\n }\n if (options?.scale != null) {\n decimal = decimal.round(options.scale, options.roundingMode ?? ROUNDING_MODE.roundHalfUp);\n }\n return decimal.toNumber();\n}\n\n/**\n * 加算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果に影響しない\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function add(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.add(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 減算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果に影響しない\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function sub(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.sub(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 乗算を行う\n * null/undefined/空文字/NaNは0と見做されるため、演算結果は0になる\n * 元の値を保持したい場合は times(price, discount ?? 1) のようにフォールバック値を指定する\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function times(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.times(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 除算を行う\n * 割る値のnull/undefined/空文字/NaNは1と見做されるため、演算結果に影響しない\n * 割る値に0を指定した場合はゼロ除算エラーになる\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {(NumberSource | null | undefined)[]} value2\n * @returns {number}\n */\nexport function div(value1: NumberSource | null | undefined, ...value2: (NumberSource | null | undefined)[]): number {\n let decimal = new Decimal(value1);\n for (const value of value2) {\n decimal = decimal.div(value);\n }\n return decimal.toNumber();\n}\n\n/**\n * 2つの値を数値として比較する\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {-1 | 0 | 1} value1がvalue2より小さい場合は-1、等しい場合は0、大きい場合は1\n */\nexport function compareTo(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): -1 | 0 | 1 {\n return new Decimal(value1).compareTo(value2);\n}\n\n/**\n * 2つの値が数値として等しいかを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function eq(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return compareTo(value1, value2) === 0;\n}\n\n/**\n * value1がvalue2より小さいかを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function lt(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return compareTo(value1, value2) < 0;\n}\n\n/**\n * value1がvalue2以下かを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function lte(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return compareTo(value1, value2) <= 0;\n}\n\n/**\n * value1がvalue2より大きいかを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function gt(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return 0 < compareTo(value1, value2);\n}\n\n/**\n * value1がvalue2以上かを返す\n * null/undefined/空文字/NaNは0と見做す\n * 数値として解釈できない文字列やInfinityを指定した場合はTypeErrorになる\n *\n * @param {NumberSource | null | undefined} value1\n * @param {NumberSource | null | undefined} value2\n * @returns {boolean}\n */\nexport function gte(value1: NumberSource | null | undefined, value2: NumberSource | null | undefined): boolean {\n return 0 <= compareTo(value1, value2);\n}\n\n/**\n * 数値を指定した桁で丸める\n * null/undefined/空文字はnull、数値として解釈できない文字列はNaNを返す\n * NaN/Infinityはそのまま返す\n * 戻り値はnumberのため、Number.MAX_SAFE_INTEGERを超える結果は精度が落ちる\n *\n * @param {NumberSource | null | undefined} value\n * @param {number} scale\n * @param {RoundingMode} [roundingMode] デフォルトは 1: 四捨五入\n * 0 切り捨て\n * 1 四捨五入\n * 2 ISO丸め\n * 3 切り上げ\n * @returns {number | null}\n * @see ROUNDING_MODE\n */\nexport function round(\n value: NumberSource | null | undefined,\n scale: number,\n roundingMode?: RoundingMode\n): number | null {\n if (value == null) {\n return null;\n }\n const rm = roundingMode ?? ROUNDING_MODE.roundHalfUp;\n switch (typeof value) {\n case 'number':\n if (!Number.isFinite(value)) {\n // NaN/Infinityはそのまま返す\n return value;\n }\n return new Decimal(value).round(scale, rm).toNumber();\n case 'string': {\n if (isBlank(value)) {\n // 空文字は値なしとしてnullと同じ扱いにする\n return null;\n }\n try {\n return new Decimal(value).round(scale, rm).toNumber();\n } catch (error) {\n // 数値として解釈できない文字列\n return Number.NaN;\n }\n }\n default:\n return new Decimal(value).round(scale, rm).toNumber();\n }\n}\n\n/**\n * 数値文字列に変換する\n * 指数表記にはならず、通常の表記で返す\n * 数値として解釈できない値はString(value)を返す\n *\n * @param {NumberSource | null | undefined} value\n * @param {*} [options]\n * ├ scale 小数桁数。指定しない場合は丸めずにすべての桁を返す\n * ├ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * @returns {string}\n * @see ROUNDING_MODE\n */\nexport function toString(\n value: NumberSource | null | undefined,\n options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n }\n): string {\n if (value == null) {\n return '';\n }\n if (isBlank(value) || (typeof value === 'number' && !Number.isFinite(value))) {\n // 空文字・NaN・Infinityは数値として扱わない\n return String(value);\n }\n try {\n const decimal = new Decimal(value);\n return options?.scale != null\n ? decimal.toFixed(options.scale, options.roundingMode ?? ROUNDING_MODE.roundHalfUp)\n : decimal.toString();\n } catch (error) {\n return String(value);\n }\n}\n\n/** toNumber のオプション */\nexport interface ToNumberOptions {\n /** 未指定(null・undefined・空白のみの文字列)のときに返す値。デフォルトは 'null' */\n empty?: 'null' | 'undefined' | 'zero';\n /** 数値として解釈できない(結果が NaN になる)ときに返す値。デフォルトは 'NaN' */\n nan?: 'NaN' | 'null' | 'undefined';\n}\n\n/** options.empty に応じた未指定時の戻り値の型。'zero' は number に含まれるので never */\ntype EmptyResult<O extends ToNumberOptions> = O extends { empty?: infer E }\n ? E extends 'undefined' ? undefined : E extends 'zero' ? never : null\n : null;\n\n/** options.nan に応じた変換不可時の戻り値の型。'NaN' は number に含まれるので never */\ntype NanResult<O extends ToNumberOptions> = O extends { nan?: infer N }\n ? N extends 'null' ? null : N extends 'undefined' ? undefined : never\n : never;\n\n/**\n * 数値に変換する\n * 文字列はカンマと前後の空白を除いてから変換する\n * null・undefined・空白のみの文字列は未指定として扱い、options.empty に応じて null(デフォルト)・undefined・0 のいずれかを返す\n * 数値として解釈できない場合は options.nan に応じて NaN(デフォルト)・null・undefined のいずれかを返す\n *\n * @param {NumberSource | null | undefined} value\n * @param {ToNumberOptions} [options]\n * ├ empty 未指定のときに返す値。'null'(デフォルト) | 'undefined' | 'zero'\n * └ nan 数値として解釈できないときに返す値。'NaN'(デフォルト) | 'null' | 'undefined'\n * @returns {number | EmptyResult<O> | NanResult<O>} 戻り値の型は options に連動する\n */\nexport function toNumber<O extends ToNumberOptions = Record<never, never>>(value: NumberSource | null | undefined, options?: O): number | EmptyResult<O> | NanResult<O> {\n type Result = number | EmptyResult<O> | NanResult<O>;\n if (value == null || isBlank(value)) {\n switch (options?.empty) {\n case 'undefined':\n return undefined as Result;\n case 'zero':\n return 0;\n default:\n return null as Result;\n }\n }\n let result: number;\n switch (typeof value) {\n case 'number':\n result = value;\n break;\n case 'bigint':\n result = Number(value);\n break;\n default:\n result = Number(removeComma(value).trim());\n }\n if (Number.isNaN(result)) {\n switch (options?.nan) {\n case 'null':\n return null as Result;\n case 'undefined':\n return undefined as Result;\n default:\n return result;\n }\n }\n return result;\n}\n\n/**\n * 渡されたバイト数値を桁数に応じてMB,GBなどに単位を変更する\n *\n * @param {NumberSource} bytes\n * @param {*} [options]\n * ┝ scale 小数以下桁数 デフォルト:2\n * ┝ roundingMode 丸めモード デフォルトはROUNDING_MODE.roundHalfUp(四捨五入・half-away-from-zero)\n * ┝ format フォーマットするか。trueを指定した場合、3桁カンマ区切り+小数末尾0の桁揃え\n * @returns {[string, string]} 精度以下を丸めた数値(文字列)と単位をタプルで返す\n */\nexport function formatBytes(\n bytes: NumberSource,\n options?: {\n scale?: number;\n roundingMode?: RoundingMode;\n format?: boolean;\n }\n): [string, string] {\n if (bytes == null || bytes === '') {\n return [String(bytes), ''];\n }\n let decimalValue: Decimal;\n switch (typeof bytes) {\n case 'number':\n if (Number.isNaN(bytes)) {\n // \"NaN\" を返却\n return ['NaN', ''];\n }\n decimalValue = new Decimal(bytes);\n break;\n case 'string':\n try {\n decimalValue = new Decimal(removeComma(bytes));\n } catch (error) {\n // 元の文字列を返却\n return [bytes, ''];\n }\n break;\n default:\n // bigintの場合\n decimalValue = new Decimal(bytes);\n }\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let i = 0;\n while (decimalValue.gte(1024) && i < units.length - 1) {\n decimalValue = decimalValue.div(1024);\n i++;\n }\n const scale = options?.scale ?? 2;\n const roundingMode = options?.roundingMode ?? ROUNDING_MODE.roundHalfUp;\n if (options?.format) {\n return [formatComma(decimalValue.toString(), scale, roundingMode), units[i]];\n }\n return [decimalValue.round(scale, roundingMode).toString(), units[i]];\n}\n"],"names":["MIN_LONG","Decimal","MAX_LONG","NUMBER_PATTERN","NUMERIC_STRING_PATTERN","isBlank","value","isLongValue","options","min","formatComma","scale","roundingMode","strValue","removeComma","matches","sign","natural","decimal","dp","decimalValue","ROUNDING_MODE","roundedMatches","displaySign","formatCompact","locale","calc","initialValue","operationItems","item","add","value1","value2","sub","times","div","compareTo","eq","lt","lte","gt","gte","round","rm","toString","toNumber","result","formatBytes","bytes","units"],"mappings":";AAOA,MAAMA,IAAW,IAAIC,EAAQ,sBAAsB,GAC7CC,IAAW,IAAID,EAAQ,qBAAqB,GAG5CE,IAAiB,IAAI,OAAO,6BAAgC,GAG5DC,IAAyB,yCAGzBC,IAAU,CAACC,MAAoC,OAAOA,KAAU,YAAYA,EAAM,WAAW;AAc5F,SAASC,EAAYD,GAAwBE,GAExC;AACV,MAAIF,KAAS,QAAQD,EAAQC,CAAK;AAChC,WAAO;AAET,QAAMG,IAAM,OAAO,SAASD,GAAS,QAAQ,IAAI,IAAIP,EAAQO,EAAS,QAAQ,IAAIR;AAClF,MAAI;AAEF,WAAOS,EAAI,IAAIH,CAAK,KAAKJ,EAAS,IAAII,CAAK;AAAA,EAC7C,QAAgB;AAEd,WAAO;AAAA,EACT;AACF;AAYO,SAASI,EAAYJ,GAAwCK,GAAgBC,GAAqC;AACvH,MAAIN,KAAS,QAAQA,MAAU;AAE7B,WAAO;AAET,MAAIO;AACJ,UAAQ,OAAOP,GAAA;AAAA,IACb,KAAK;AACH,UAAI,CAAC,OAAO,SAASA,CAAK;AAExB,eAAO,OAAOA,CAAK;AAGrB,MAAAO,IAAW,IAAIZ,EAAQK,CAAK,EAAE,SAAA;AAC9B;AAAA,IACF,KAAK;AAEH,UADAO,IAAWC,EAAYR,CAAK,EAAE,KAAA,GAC1B,CAACF,EAAuB,KAAKS,CAAQ;AAEvC,eAAOP;AAET,MAAI,KAAK,KAAKO,CAAQ,MAGpBA,IAAW,GADMA,EAAS,WAAW,GAAG,IAAI,MAAM,EAC5B,GAAG,IAAIZ,EAAQY,CAAQ,EAAE,UAAU;AAE3D;AAAA,IACF;AAEE,MAAAA,IAAWP,EAAM,SAAA;AAAA,EAAS;AAE9B,QAAMS,IAAUZ,EAAe,KAAKU,CAAQ,GACtCG,IAAOD,EAAQ,CAAC;AACtB,MAAIE,IAAUF,EAAQ,CAAC,KAAK,KACxBG,IAAUH,EAAQ,CAAC,GACnBI,GACAC,IAAe,IAAInB,EAAQ,GAAGe,MAAS,MAAM,MAAM,EAAE,GAAGC,CAAO,IAAIC,CAAO,EAAE;AAChF,MAAIP,KAAS,MAAM;AACjB,IAAAS,IAAeA,EAAa,MAAMT,GAAOC,KAAgBS,EAAc,WAAW;AAClF,UAAMC,IAAiBnB,EAAe,KAAKiB,EAAa,UAAU;AAClE,IAAAH,IAAUK,EAAe,CAAC,GAC1BJ,IAAUI,EAAe,CAAC,GAC1BH,IAAKR;AAAA,EACP;AACE,IAAAQ,IAAKD,EAAQ;AAGf,QAAMK,IAAcH,EAAa,GAAG,CAAC,IAAI,KAAKJ;AAC9C,SAAAC,IAAUA,EAAQ,QAAQ,sBAAsB,KAAK,GACrDC,IAAU,GAAGA,CAAO,GAAG,IAAI,OAAOC,CAAE,CAAC,GAAG,UAAU,GAAGA,CAAE,GAChDD,MAAY,KACf,GAAGK,CAAW,GAAGN,CAAO,KACxB,GAAGM,CAAW,GAAGN,CAAO,IAAIC,CAAO;AACzC;AAQO,SAASJ,EAAYR,GAAuB;AACjD,SAAOA,EAAM,QAAQ,MAAM,EAAE;AAC/B;AAUO,SAASkB,EAAclB,GAAemB,GAAwB;AACnE,SAAO,IAAI,KAAK,aAAaA,GAAQ,EAAE,UAAU,UAAA,CAAW,EAAE,OAAOnB,CAAK;AAC5E;AA0CO,SAASoB,EAAKC,GAA+CC,GAAiCpB,GAG1F;AACT,MAAIU,IAAU,IAAIjB,EAAQ0B,CAAY;AACtC,aAAWE,KAAQD;AACjB,IAAAV,IAAUA,EAAQW,EAAK,QAAQ,EAAEA,EAAK,KAAK;AAE7C,SAAIrB,GAAS,SAAS,SACpBU,IAAUA,EAAQ,MAAMV,EAAQ,OAAOA,EAAQ,gBAAgBa,EAAc,WAAW,IAEnFH,EAAQ,SAAA;AACjB;AAWO,SAASY,EAAIC,MAA4CC,GAAqD;AACnH,MAAId,IAAU,IAAIjB,EAAQ8B,CAAM;AAChC,aAAWzB,KAAS0B;AAClB,IAAAd,IAAUA,EAAQ,IAAIZ,CAAK;AAE7B,SAAOY,EAAQ,SAAA;AACjB;AAWO,SAASe,EAAIF,MAA4CC,GAAqD;AACnH,MAAId,IAAU,IAAIjB,EAAQ8B,CAAM;AAChC,aAAWzB,KAAS0B;AAClB,IAAAd,IAAUA,EAAQ,IAAIZ,CAAK;AAE7B,SAAOY,EAAQ,SAAA;AACjB;AAYO,SAASgB,EAAMH,MAA4CC,GAAqD;AACrH,MAAId,IAAU,IAAIjB,EAAQ8B,CAAM;AAChC,aAAWzB,KAAS0B;AAClB,IAAAd,IAAUA,EAAQ,MAAMZ,CAAK;AAE/B,SAAOY,EAAQ,SAAA;AACjB;AAYO,SAASiB,EAAIJ,MAA4CC,GAAqD;AACnH,MAAId,IAAU,IAAIjB,EAAQ8B,CAAM;AAChC,aAAWzB,KAAS0B;AAClB,IAAAd,IAAUA,EAAQ,IAAIZ,CAAK;AAE7B,SAAOY,EAAQ,SAAA;AACjB;AAWO,SAASkB,EAAUL,GAAyCC,GAAqD;AACtH,SAAO,IAAI/B,EAAQ8B,CAAM,EAAE,UAAUC,CAAM;AAC7C;AAWO,SAASK,EAAGN,GAAyCC,GAAkD;AAC5G,SAAOI,EAAUL,GAAQC,CAAM,MAAM;AACvC;AAWO,SAASM,EAAGP,GAAyCC,GAAkD;AAC5G,SAAOI,EAAUL,GAAQC,CAAM,IAAI;AACrC;AAWO,SAASO,EAAIR,GAAyCC,GAAkD;AAC7G,SAAOI,EAAUL,GAAQC,CAAM,KAAK;AACtC;AAWO,SAASQ,EAAGT,GAAyCC,GAAkD;AAC5G,SAAO,IAAII,EAAUL,GAAQC,CAAM;AACrC;AAWO,SAASS,EAAIV,GAAyCC,GAAkD;AAC7G,SAAO,KAAKI,EAAUL,GAAQC,CAAM;AACtC;AAkBO,SAASU,EACdpC,GACAK,GACAC,GACe;AACf,MAAIN,KAAS;AACX,WAAO;AAET,QAAMqC,IAAK/B,KAAgBS,EAAc;AACzC,UAAQ,OAAOf,GAAA;AAAA,IACb,KAAK;AACH,aAAK,OAAO,SAASA,CAAK,IAInB,IAAIL,EAAQK,CAAK,EAAE,MAAMK,GAAOgC,CAAE,EAAE,SAAA,IAFlCrC;AAAA,IAGX,KAAK,UAAU;AACb,UAAID,EAAQC,CAAK;AAEf,eAAO;AAET,UAAI;AACF,eAAO,IAAIL,EAAQK,CAAK,EAAE,MAAMK,GAAOgC,CAAE,EAAE,SAAA;AAAA,MAC7C,QAAgB;AAEd,eAAO,OAAO;AAAA,MAChB;AAAA,IACF;AAAA,IACA;AACE,aAAO,IAAI1C,EAAQK,CAAK,EAAE,MAAMK,GAAOgC,CAAE,EAAE,SAAA;AAAA,EAAS;AAE1D;AAcO,SAASC,EACdtC,GACAE,GAIQ;AACR,MAAIF,KAAS;AACX,WAAO;AAET,MAAID,EAAQC,CAAK,KAAM,OAAOA,KAAU,YAAY,CAAC,OAAO,SAASA,CAAK;AAExE,WAAO,OAAOA,CAAK;AAErB,MAAI;AACF,UAAMY,IAAU,IAAIjB,EAAQK,CAAK;AACjC,WAAOE,GAAS,SAAS,OACrBU,EAAQ,QAAQV,EAAQ,OAAOA,EAAQ,gBAAgBa,EAAc,WAAW,IAChFH,EAAQ,SAAA;AAAA,EACd,QAAgB;AACd,WAAO,OAAOZ,CAAK;AAAA,EACrB;AACF;AAgCO,SAASuC,EAA2DvC,GAAwCE,GAAqD;AAEtK,MAAIF,KAAS,QAAQD,EAAQC,CAAK;AAChC,YAAQE,GAAS,OAAA;AAAA,MACf,KAAK;AACH;AAAA,MACF,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IAAA;AAGb,MAAIsC;AACJ,UAAQ,OAAOxC,GAAA;AAAA,IACb,KAAK;AACH,MAAAwC,IAASxC;AACT;AAAA,IACF,KAAK;AACH,MAAAwC,IAAS,OAAOxC,CAAK;AACrB;AAAA,IACF;AACE,MAAAwC,IAAS,OAAOhC,EAAYR,CAAK,EAAE,MAAM;AAAA,EAAA;AAE7C,MAAI,OAAO,MAAMwC,CAAM;AACrB,YAAQtC,GAAS,KAAA;AAAA,MACf,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH;AAAA,MACF;AACE,eAAOsC;AAAA,IAAA;AAGb,SAAOA;AACT;AAYO,SAASC,EACdC,GACAxC,GAKkB;AAClB,MAAIwC,KAAS,QAAQA,MAAU;AAC7B,WAAO,CAAC,OAAOA,CAAK,GAAG,EAAE;AAE3B,MAAI5B;AACJ,UAAQ,OAAO4B,GAAA;AAAA,IACb,KAAK;AACH,UAAI,OAAO,MAAMA,CAAK;AAEpB,eAAO,CAAC,OAAO,EAAE;AAEnB,MAAA5B,IAAe,IAAInB,EAAQ+C,CAAK;AAChC;AAAA,IACF,KAAK;AACH,UAAI;AACF,QAAA5B,IAAe,IAAInB,EAAQa,EAAYkC,CAAK,CAAC;AAAA,MAC/C,QAAgB;AAEd,eAAO,CAACA,GAAO,EAAE;AAAA,MACnB;AACA;AAAA,IACF;AAEE,MAAA5B,IAAe,IAAInB,EAAQ+C,CAAK;AAAA,EAAA;AAEpC,QAAMC,IAAQ,CAAC,KAAK,MAAM,MAAM,MAAM,IAAI;AAC1C,MAAI,IAAI;AACR,SAAO7B,EAAa,IAAI,IAAI,KAAK,IAAI6B,EAAM,SAAS;AAClD,IAAA7B,IAAeA,EAAa,IAAI,IAAI,GACpC;AAEF,QAAMT,IAAQH,GAAS,SAAS,GAC1BI,IAAeJ,GAAS,gBAAgBa,EAAc;AAC5D,SAAIb,GAAS,SACJ,CAACE,EAAYU,EAAa,SAAA,GAAYT,GAAOC,CAAY,GAAGqC,EAAM,CAAC,CAAC,IAEtE,CAAC7B,EAAa,MAAMT,GAAOC,CAAY,EAAE,SAAA,GAAYqC,EAAM,CAAC,CAAC;AACtE;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./decimal.cjs"),t=require("./number-util-BSra7lF5.cjs");exports.ROUNDING_MODE=e.ROUNDING_MODE;exports.add=t.add;exports.calc=t.calc;exports.compareTo=t.compareTo;exports.div=t.div;exports.eq=t.eq;exports.formatBytes=t.formatBytes;exports.formatComma=t.formatComma;exports.formatCompact=t.formatCompact;exports.gt=t.gt;exports.gte=t.gte;exports.isLongValue=t.isLongValue;exports.lt=t.lt;exports.lte=t.lte;exports.removeComma=t.removeComma;exports.round=t.round;exports.sub=t.sub;exports.times=t.times;exports.toNumber=t.toNumber;exports.toString=t.toString;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./decimal.cjs"),t=require("./number-util-BrDEKYJo.cjs");exports.ROUNDING_MODE=e.ROUNDING_MODE;exports.add=t.add;exports.calc=t.calc;exports.compareTo=t.compareTo;exports.div=t.div;exports.eq=t.eq;exports.formatBytes=t.formatBytes;exports.formatComma=t.formatComma;exports.formatCompact=t.formatCompact;exports.gt=t.gt;exports.gte=t.gte;exports.isLongValue=t.isLongValue;exports.lt=t.lt;exports.lte=t.lte;exports.removeComma=t.removeComma;exports.round=t.round;exports.sub=t.sub;exports.times=t.times;exports.toNumber=t.toNumber;exports.toString=t.toString;
2
2
  //# sourceMappingURL=number-util.cjs.map
@@ -220,15 +220,34 @@ export declare function toString(value: NumberSource | null | undefined, options
220
220
  scale?: number;
221
221
  roundingMode?: RoundingMode;
222
222
  }): string;
223
+ /** toNumber のオプション */
224
+ export interface ToNumberOptions {
225
+ /** 未指定(null・undefined・空白のみの文字列)のときに返す値。デフォルトは 'null' */
226
+ empty?: 'null' | 'undefined' | 'zero';
227
+ /** 数値として解釈できない(結果が NaN になる)ときに返す値。デフォルトは 'NaN' */
228
+ nan?: 'NaN' | 'null' | 'undefined';
229
+ }
230
+ /** options.empty に応じた未指定時の戻り値の型。'zero' は number に含まれるので never */
231
+ type EmptyResult<O extends ToNumberOptions> = O extends {
232
+ empty?: infer E;
233
+ } ? E extends 'undefined' ? undefined : E extends 'zero' ? never : null : null;
234
+ /** options.nan に応じた変換不可時の戻り値の型。'NaN' は number に含まれるので never */
235
+ type NanResult<O extends ToNumberOptions> = O extends {
236
+ nan?: infer N;
237
+ } ? N extends 'null' ? null : N extends 'undefined' ? undefined : never : never;
223
238
  /**
224
239
  * 数値に変換する
225
- * null・undefined・空文字は未指定として null を返す
226
- * 文字列はカンマを除いてから変換し、数値として解釈できない場合は NaN を返す
240
+ * 文字列はカンマと前後の空白を除いてから変換する
241
+ * null・undefined・空白のみの文字列は未指定として扱い、options.empty に応じて null(デフォルト)・undefined・0 のいずれかを返す
242
+ * 数値として解釈できない場合は options.nan に応じて NaN(デフォルト)・null・undefined のいずれかを返す
227
243
  *
228
244
  * @param {NumberSource | null | undefined} value
229
- * @returns {number | null}
245
+ * @param {ToNumberOptions} [options]
246
+ * ├ empty 未指定のときに返す値。'null'(デフォルト) | 'undefined' | 'zero'
247
+ * └ nan 数値として解釈できないときに返す値。'NaN'(デフォルト) | 'null' | 'undefined'
248
+ * @returns {number | EmptyResult<O> | NanResult<O>} 戻り値の型は options に連動する
230
249
  */
231
- export declare function toNumber(value: NumberSource | null | undefined): number | null;
250
+ export declare function toNumber<O extends ToNumberOptions = Record<never, never>>(value: NumberSource | null | undefined, options?: O): number | EmptyResult<O> | NanResult<O>;
232
251
  /**
233
252
  * 渡されたバイト数値を桁数に応じてMB,GBなどに単位を変更する
234
253
  *
@@ -220,15 +220,34 @@ export declare function toString(value: NumberSource | null | undefined, options
220
220
  scale?: number;
221
221
  roundingMode?: RoundingMode;
222
222
  }): string;
223
+ /** toNumber のオプション */
224
+ export interface ToNumberOptions {
225
+ /** 未指定(null・undefined・空白のみの文字列)のときに返す値。デフォルトは 'null' */
226
+ empty?: 'null' | 'undefined' | 'zero';
227
+ /** 数値として解釈できない(結果が NaN になる)ときに返す値。デフォルトは 'NaN' */
228
+ nan?: 'NaN' | 'null' | 'undefined';
229
+ }
230
+ /** options.empty に応じた未指定時の戻り値の型。'zero' は number に含まれるので never */
231
+ type EmptyResult<O extends ToNumberOptions> = O extends {
232
+ empty?: infer E;
233
+ } ? E extends 'undefined' ? undefined : E extends 'zero' ? never : null : null;
234
+ /** options.nan に応じた変換不可時の戻り値の型。'NaN' は number に含まれるので never */
235
+ type NanResult<O extends ToNumberOptions> = O extends {
236
+ nan?: infer N;
237
+ } ? N extends 'null' ? null : N extends 'undefined' ? undefined : never : never;
223
238
  /**
224
239
  * 数値に変換する
225
- * null・undefined・空文字は未指定として null を返す
226
- * 文字列はカンマを除いてから変換し、数値として解釈できない場合は NaN を返す
240
+ * 文字列はカンマと前後の空白を除いてから変換する
241
+ * null・undefined・空白のみの文字列は未指定として扱い、options.empty に応じて null(デフォルト)・undefined・0 のいずれかを返す
242
+ * 数値として解釈できない場合は options.nan に応じて NaN(デフォルト)・null・undefined のいずれかを返す
227
243
  *
228
244
  * @param {NumberSource | null | undefined} value
229
- * @returns {number | null}
245
+ * @param {ToNumberOptions} [options]
246
+ * ├ empty 未指定のときに返す値。'null'(デフォルト) | 'undefined' | 'zero'
247
+ * └ nan 数値として解釈できないときに返す値。'NaN'(デフォルト) | 'null' | 'undefined'
248
+ * @returns {number | EmptyResult<O> | NanResult<O>} 戻り値の型は options に連動する
230
249
  */
231
- export declare function toNumber(value: NumberSource | null | undefined): number | null;
250
+ export declare function toNumber<O extends ToNumberOptions = Record<never, never>>(value: NumberSource | null | undefined, options?: O): number | EmptyResult<O> | NanResult<O>;
232
251
  /**
233
252
  * 渡されたバイト数値を桁数に応じてMB,GBなどに単位を変更する
234
253
  *
@@ -1,5 +1,5 @@
1
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 u, l as b, m as n, r as C, o as N, s as q, t as v, p as x, q as D } from "./number-util-DXjPN_-P.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 u, l as b, m as n, r as C, o as N, s as q, t as v, p as x, q as D } from "./number-util-Wpubbqr4.js";
3
3
  export {
4
4
  o as ROUNDING_MODE,
5
5
  m as add,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@digitalwalletcorp/utils",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "A javascript utility.",
5
5
  "type": "module",
6
6
  "main": "lib/index.cjs",
@@ -419,26 +419,70 @@ 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
+
422
440
  /**
423
441
  * 数値に変換する
424
- * null・undefined・空文字は未指定として null を返す
425
- * 文字列はカンマを除いてから変換し、数値として解釈できない場合は NaN を返す
442
+ * 文字列はカンマと前後の空白を除いてから変換する
443
+ * null・undefined・空白のみの文字列は未指定として扱い、options.empty に応じて null(デフォルト)・undefined・0 のいずれかを返す
444
+ * 数値として解釈できない場合は options.nan に応じて NaN(デフォルト)・null・undefined のいずれかを返す
426
445
  *
427
446
  * @param {NumberSource | null | undefined} value
428
- * @returns {number | null}
447
+ * @param {ToNumberOptions} [options]
448
+ * ├ empty 未指定のときに返す値。'null'(デフォルト) | 'undefined' | 'zero'
449
+ * └ nan 数値として解釈できないときに返す値。'NaN'(デフォルト) | 'null' | 'undefined'
450
+ * @returns {number | EmptyResult<O> | NanResult<O>} 戻り値の型は options に連動する
429
451
  */
430
- export function toNumber(value: NumberSource | null | undefined): number | null {
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>;
431
454
  if (value == null || isBlank(value)) {
432
- return null;
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
+ }
433
463
  }
464
+ let result: number;
434
465
  switch (typeof value) {
435
466
  case 'number':
436
- return value;
467
+ result = value;
468
+ break;
437
469
  case 'bigint':
438
- return Number(value);
470
+ result = Number(value);
471
+ break;
439
472
  default:
440
- return Number(removeComma(value).trim());
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
+ }
441
484
  }
485
+ return result;
442
486
  }
443
487
 
444
488
  /**
@@ -1,2 +0,0 @@
1
- "use strict";const i=require("./decimal.cjs"),C=new i.Decimal("-9223372036854775808"),V=new i.Decimal("9223372036854775807"),b=new RegExp("([+-]?)([0-9]*)[.]?([0-9]*)"),F=/^[+-]?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i,d=t=>typeof t=="string"&&t.trim()==="";function w(t,e){if(t==null||d(t))return!1;const r=Number.isFinite(e?.minValue)?new i.Decimal(e.minValue):C;try{return r.lte(t)&&V.gte(t)}catch{return!1}}function g(t,e,r){if(t==null||t==="")return"";let n;switch(typeof t){case"number":if(!Number.isFinite(t))return String(t);n=new i.Decimal(t).toString();break;case"string":if(n=a(t).trim(),!F.test(n))return t;/e/i.test(n)&&(n=`${n.startsWith("+")?"+":""}${new i.Decimal(n).toString()}`);break;default:n=t.toString()}const o=b.exec(n),l=o[1];let u=o[2]||"0",c=o[3],f,s=new i.Decimal(`${l==="-"?"-":""}${u}.${c}`);if(e!=null){s=s.round(e,r??i.ROUNDING_MODE.roundHalfUp);const N=b.exec(s.toString());u=N[2],c=N[3],f=e}else f=c.length;const D=s.eq(0)?"":l;return u=u.replace(/(\d)(?=(\d{3})+$)/g,"$1,"),c=`${c}${"0".repeat(f)}`.substring(0,f),c===""?`${D}${u}`:`${D}${u}.${c}`}function a(t){return t.replace(/,/g,"")}function $(t,e){return new Intl.NumberFormat(e,{notation:"compact"}).format(t)}function p(t,e,r){let n=new i.Decimal(t);for(const o of e)n=n[o.operator](o.value);return r?.scale!=null&&(n=n.round(r.scale,r.roundingMode??i.ROUNDING_MODE.roundHalfUp)),n.toNumber()}function S(t,...e){let r=new i.Decimal(t);for(const n of e)r=r.add(n);return r.toNumber()}function M(t,...e){let r=new i.Decimal(t);for(const n of e)r=r.sub(n);return r.toNumber()}function O(t,...e){let r=new i.Decimal(t);for(const n of e)r=r.times(n);return r.toNumber()}function U(t,...e){let r=new i.Decimal(t);for(const n of e)r=r.div(n);return r.toNumber()}function m(t,e){return new i.Decimal(t).compareTo(e)}function _(t,e){return m(t,e)===0}function h(t,e){return m(t,e)<0}function R(t,e){return m(t,e)<=0}function E(t,e){return 0<m(t,e)}function G(t,e){return 0<=m(t,e)}function I(t,e,r){if(t==null)return null;const n=r??i.ROUNDING_MODE.roundHalfUp;switch(typeof t){case"number":return Number.isFinite(t)?new i.Decimal(t).round(e,n).toNumber():t;case"string":{if(d(t))return null;try{return new i.Decimal(t).round(e,n).toNumber()}catch{return Number.NaN}}default:return new i.Decimal(t).round(e,n).toNumber()}}function T(t,e){if(t==null)return"";if(d(t)||typeof t=="number"&&!Number.isFinite(t))return String(t);try{const r=new i.Decimal(t);return e?.scale!=null?r.toFixed(e.scale,e.roundingMode??i.ROUNDING_MODE.roundHalfUp):r.toString()}catch{return String(t)}}function B(t){if(t==null||d(t))return null;switch(typeof t){case"number":return t;case"bigint":return Number(t);default:return Number(a(t).trim())}}function y(t,e){if(t==null||t==="")return[String(t),""];let r;switch(typeof t){case"number":if(Number.isNaN(t))return["NaN",""];r=new i.Decimal(t);break;case"string":try{r=new i.Decimal(a(t))}catch{return[t,""]}break;default:r=new i.Decimal(t)}const n=["B","KB","MB","GB","TB"];let o=0;for(;r.gte(1024)&&o<n.length-1;)r=r.div(1024),o++;const l=e?.scale??2,u=e?.roundingMode??i.ROUNDING_MODE.roundHalfUp;return e?.format?[g(r.toString(),l,u),n[o]]:[r.round(l,u).toString(),n[o]]}const k=Object.freeze(Object.defineProperty({__proto__:null,ROUNDING_MODE:i.ROUNDING_MODE,add:S,calc:p,compareTo:m,div:U,eq:_,formatBytes:y,formatComma:g,formatCompact:$,gt:E,gte:G,isLongValue:w,lt:h,lte:R,removeComma:a,round:I,sub:M,times:O,toNumber:B,toString:T},Symbol.toStringTag,{value:"Module"}));exports.add=S;exports.calc=p;exports.compareTo=m;exports.div=U;exports.eq=_;exports.formatBytes=y;exports.formatComma=g;exports.formatCompact=$;exports.gt=E;exports.gte=G;exports.isLongValue=w;exports.lt=h;exports.lte=R;exports.numberUtil=k;exports.removeComma=a;exports.round=I;exports.sub=M;exports.times=O;exports.toNumber=B;exports.toString=T;
2
- //# sourceMappingURL=number-util-BSra7lF5.cjs.map