@planarcat/js-toolkit 1.3.1 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/object/toFormattedNumber.d.ts +9 -7
- package/dist/object/toFormattedNumber.d.ts.map +1 -1
- package/dist/object/toFormattedNumber.js +11 -11
- package/dist/object/toFormattedNumber.js.map +1 -1
- package/dist/object/toFormattedNumberString.d.ts +4 -0
- package/dist/object/toFormattedNumberString.d.ts.map +1 -0
- package/dist/object/toFormattedNumberString.js +187 -0
- package/dist/object/toFormattedNumberString.js.map +1 -0
- package/dist/types/object.d.ts +36 -1
- package/dist/types/object.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -70,7 +70,7 @@ debouncedFn();
|
|
|
70
70
|
### 数字格式化
|
|
71
71
|
|
|
72
72
|
```typescript
|
|
73
|
-
import { toFormattedNumber } from '@planarcat/js-toolkit';
|
|
73
|
+
import { toFormattedNumber, toFormattedNumberString } from '@planarcat/js-toolkit';
|
|
74
74
|
|
|
75
75
|
// 基本使用
|
|
76
76
|
console.log(toFormattedNumber(1234.5678));
|
|
@@ -96,6 +96,41 @@ console.log(
|
|
|
96
96
|
])
|
|
97
97
|
);
|
|
98
98
|
// 输出: [[1, 1.23], [45.67, [89.01, NaN]]]
|
|
99
|
+
|
|
100
|
+
// 数字转格式化字符串
|
|
101
|
+
console.log(toFormattedNumberString(1234.5678, { decimalPlaces: 2 }));
|
|
102
|
+
// 输出: "1234.57"
|
|
103
|
+
|
|
104
|
+
// 保留两位小数,不够时补0
|
|
105
|
+
console.log(toFormattedNumberString(123.4, { decimalPlaces: 2 }));
|
|
106
|
+
// 输出: "123.40"
|
|
107
|
+
|
|
108
|
+
// 带前缀后缀
|
|
109
|
+
console.log(toFormattedNumberString(1234.5678, { prefix: '$', suffix: ' USD' }));
|
|
110
|
+
// 输出: "$1234.5678 USD"
|
|
111
|
+
|
|
112
|
+
// 本地化格式
|
|
113
|
+
console.log(toFormattedNumberString(1234567.89, { useLocalizedFormat: true }));
|
|
114
|
+
// 输出: "1,234,567.89"
|
|
115
|
+
|
|
116
|
+
// 自定义NaN和0显示
|
|
117
|
+
console.log(toFormattedNumberString(null, { nanValue: 'N/A' }));
|
|
118
|
+
// 输出: "N/A"
|
|
119
|
+
console.log(toFormattedNumberString(0, { zeroValue: '-' }));
|
|
120
|
+
// 输出: "-"
|
|
121
|
+
|
|
122
|
+
// 预处理函数
|
|
123
|
+
console.log(
|
|
124
|
+
toFormattedNumberString(0.1234, {
|
|
125
|
+
preProcessor: num => num * 100,
|
|
126
|
+
suffix: '%',
|
|
127
|
+
})
|
|
128
|
+
);
|
|
129
|
+
// 输出: "12.34%"
|
|
130
|
+
|
|
131
|
+
// 处理数组
|
|
132
|
+
console.log(toFormattedNumberString([123.456, '789.012'], { decimalPlaces: 2 }));
|
|
133
|
+
// 输出: ["123.46", "789.01"]
|
|
99
134
|
```
|
|
100
135
|
|
|
101
136
|
## API 文档
|
|
@@ -196,6 +231,15 @@ npm run test:coverage
|
|
|
196
231
|
|
|
197
232
|
## 更新日志
|
|
198
233
|
|
|
234
|
+
### v1.4.0
|
|
235
|
+
|
|
236
|
+
- ✨ 优化数字格式化功能,无数字字符串返回 `0` 而不是 `NaN`
|
|
237
|
+
- ✨ 改进 `toFormattedNumberString` 函数,无数字字符串直接返回 `zeroValue`
|
|
238
|
+
- ✨ 为 `toFormattedNumberString` 函数的前缀后缀添加函数类型支持
|
|
239
|
+
- ✨ 完善文档和测试用例
|
|
240
|
+
- ✨ 优化深层数组处理逻辑
|
|
241
|
+
- ✨ 修复 0 值、NaN 值和无数字字符串的前缀后缀处理问题
|
|
242
|
+
|
|
199
243
|
### v1.3.0
|
|
200
244
|
|
|
201
245
|
- ✨ 添加数字格式化功能 `toFormattedNumber`
|
package/dist/index.d.ts
CHANGED
|
@@ -10,5 +10,6 @@ export type { DebounceOptions, DebouncedFunction } from "./types/function";
|
|
|
10
10
|
export declare const VERSION = "__VERSION__";
|
|
11
11
|
export declare const LIBRARY_NAME = "@planarcat/js-toolkit";
|
|
12
12
|
export { default as toFormattedNumber } from "./object/toFormattedNumber";
|
|
13
|
-
export
|
|
13
|
+
export { default as toFormattedNumberString } from "./object/toFormattedNumberString";
|
|
14
|
+
export type { ToFormattedNumberOptions, ToFormattedNumberStringOptions, } from "./types/object";
|
|
14
15
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC1D,YAAY,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGjE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAG3E,eAAO,MAAM,OAAO,gBAAgB,CAAC;AACrC,eAAO,MAAM,YAAY,0BAA0B,CAAC;AAGpD,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC1D,YAAY,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGjE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAG3E,eAAO,MAAM,OAAO,gBAAgB,CAAC;AACrC,eAAO,MAAM,YAAY,0BAA0B,CAAC;AAGpD,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AACtF,YAAY,EACV,wBAAwB,EACxB,8BAA8B,GAC/B,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -8,7 +8,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
8
8
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
9
9
|
};
|
|
10
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
-
exports.toFormattedNumber = exports.LIBRARY_NAME = exports.VERSION = exports.debounce = exports.formatDate = void 0;
|
|
11
|
+
exports.toFormattedNumberString = exports.toFormattedNumber = exports.LIBRARY_NAME = exports.VERSION = exports.debounce = exports.formatDate = void 0;
|
|
12
12
|
// 日期相关工具
|
|
13
13
|
var formatDate_1 = require("./date/formatDate");
|
|
14
14
|
Object.defineProperty(exports, "formatDate", { enumerable: true, get: function () { return __importDefault(formatDate_1).default; } });
|
|
@@ -21,6 +21,8 @@ exports.LIBRARY_NAME = "@planarcat/js-toolkit";
|
|
|
21
21
|
// 对象相关工具
|
|
22
22
|
var toFormattedNumber_1 = require("./object/toFormattedNumber");
|
|
23
23
|
Object.defineProperty(exports, "toFormattedNumber", { enumerable: true, get: function () { return __importDefault(toFormattedNumber_1).default; } });
|
|
24
|
+
var toFormattedNumberString_1 = require("./object/toFormattedNumberString");
|
|
25
|
+
Object.defineProperty(exports, "toFormattedNumberString", { enumerable: true, get: function () { return __importDefault(toFormattedNumberString_1).default; } });
|
|
24
26
|
// 工具函数(后续添加)
|
|
25
27
|
// export { default as toNumber } from './number/toNumber';
|
|
26
28
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;AAEH,SAAS;AACT,gDAA0D;AAAjD,yHAAA,OAAO,OAAc;AAG9B,SAAS;AACT,gDAA0D;AAAjD,qHAAA,OAAO,OAAY;AAG5B,SAAS;AACI,QAAA,OAAO,GAAG,aAAa,CAAC,CAAC,QAAQ;AACjC,QAAA,YAAY,GAAG,uBAAuB,CAAC;AAEpD,SAAS;AACT,gEAA0E;AAAjE,uIAAA,OAAO,OAAqB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;AAEH,SAAS;AACT,gDAA0D;AAAjD,yHAAA,OAAO,OAAc;AAG9B,SAAS;AACT,gDAA0D;AAAjD,qHAAA,OAAO,OAAY;AAG5B,SAAS;AACI,QAAA,OAAO,GAAG,aAAa,CAAC,CAAC,QAAQ;AACjC,QAAA,YAAY,GAAG,uBAAuB,CAAC;AAEpD,SAAS;AACT,gEAA0E;AAAjE,uIAAA,OAAO,OAAqB;AACrC,4EAAsF;AAA7E,mJAAA,OAAO,OAA2B;AAM3C,aAAa;AACb,2DAA2D"}
|
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
* 对于字符串,会提取其中的数字部分进行转换
|
|
6
6
|
* 支持深层数组递归处理
|
|
7
7
|
*
|
|
8
|
-
* @param object -
|
|
8
|
+
* @param object - 要格式化的目标
|
|
9
9
|
* @param options - 格式化选项
|
|
10
10
|
* @param options.decimalPlaces - 保留多少位小数,默认true(保留所有小数位)
|
|
11
11
|
* true: 保留所有小数位,不额外处理
|
|
12
12
|
* number: 保留指定小数位,四舍五入
|
|
13
|
-
* @param options.
|
|
13
|
+
* @param options.nanValue - 当值为NaN时的显示,默认NaN
|
|
14
14
|
*
|
|
15
15
|
* @returns 格式化后的数字或数字数组
|
|
16
16
|
* - 如果输入是单个值,返回格式化后的数字
|
|
@@ -36,24 +36,26 @@
|
|
|
36
36
|
* toFormattedNumber(undefined); // NaN
|
|
37
37
|
* toFormattedNumber(Symbol('test')); // NaN
|
|
38
38
|
* toFormattedNumber(() => {}); // NaN
|
|
39
|
+
* toFormattedNumber('abc'); // 0
|
|
40
|
+
* toFormattedNumber(''); // 0
|
|
39
41
|
*
|
|
40
42
|
* // 一维数组
|
|
41
43
|
* toFormattedNumber([123.456, '456.789def']); // [123.456, 456.789]
|
|
42
44
|
*
|
|
43
45
|
* // 深层数组
|
|
44
46
|
* toFormattedNumber([[1, '1', null], 'xxx', ['123a', ['123', '456ff']]]);
|
|
45
|
-
* // 返回: [[1, 1, NaN],
|
|
47
|
+
* // 返回: [[1, 1, NaN], 0, [123, [123, 456]]]
|
|
46
48
|
*
|
|
47
49
|
* // 保留指定小数位
|
|
48
50
|
* toFormattedNumber(123.456, { decimalPlaces: 2 }); // 123.46
|
|
49
51
|
* toFormattedNumber(123.456, { decimalPlaces: 0 }); // 123
|
|
50
52
|
*
|
|
51
53
|
* // 自定义NaN显示
|
|
52
|
-
* toFormattedNumber(null, {
|
|
53
|
-
* toFormattedNumber('abc', {
|
|
54
|
+
* toFormattedNumber(null, { nanValue: 0 }); // 0
|
|
55
|
+
* toFormattedNumber('abc', { nanValue: -1 }); // -1
|
|
54
56
|
* ```
|
|
55
57
|
*/
|
|
56
|
-
declare function toFormattedNumber(object: unknown[], options?: import(
|
|
57
|
-
declare function toFormattedNumber(object: unknown, options?: import(
|
|
58
|
+
declare function toFormattedNumber(object: unknown[], options?: import("../types/object").ToFormattedNumberOptions): number[];
|
|
59
|
+
declare function toFormattedNumber(object: unknown, options?: import("../types/object").ToFormattedNumberOptions): number | number[];
|
|
58
60
|
export default toFormattedNumber;
|
|
59
61
|
//# sourceMappingURL=toFormattedNumber.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toFormattedNumber.d.ts","sourceRoot":"","sources":["../../src/object/toFormattedNumber.ts"],"names":[],"mappings":"AA0CA
|
|
1
|
+
{"version":3,"file":"toFormattedNumber.d.ts","sourceRoot":"","sources":["../../src/object/toFormattedNumber.ts"],"names":[],"mappings":"AA0CA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AAEH,iBAAS,iBAAiB,CACxB,MAAM,EAAE,OAAO,EAAE,EACjB,OAAO,CAAC,EAAE,OAAO,iBAAiB,EAAE,wBAAwB,GAC3D,MAAM,EAAE,CAAC;AAEZ,iBAAS,iBAAiB,CACxB,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE,OAAO,iBAAiB,EAAE,wBAAwB,GAC3D,MAAM,GAAG,MAAM,EAAE,CAAC;AAmDrB,eAAe,iBAAiB,CAAC"}
|
|
@@ -8,7 +8,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
8
8
|
function extractNumberFromString(str) {
|
|
9
9
|
// 匹配数字体系:0~9,小数点,正负号,科学计数法
|
|
10
10
|
const match = str.match(/[-+]?\d*\.?\d+(?:[eE][-+]?\d+)?/);
|
|
11
|
-
return match ? match[0] :
|
|
11
|
+
return match ? match[0] : "";
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
14
|
* 将单个值转换为数字
|
|
@@ -17,24 +17,24 @@ function extractNumberFromString(str) {
|
|
|
17
17
|
*/
|
|
18
18
|
function convertToNumber(value) {
|
|
19
19
|
switch (typeof value) {
|
|
20
|
-
case
|
|
20
|
+
case "number":
|
|
21
21
|
return value;
|
|
22
|
-
case
|
|
22
|
+
case "string": {
|
|
23
23
|
const numStr = extractNumberFromString(value);
|
|
24
|
-
return numStr ? Number(numStr) :
|
|
24
|
+
return numStr ? Number(numStr) : 0;
|
|
25
25
|
}
|
|
26
|
-
case
|
|
26
|
+
case "boolean":
|
|
27
27
|
return value ? 1 : 0;
|
|
28
|
-
case
|
|
29
|
-
case
|
|
28
|
+
case "function":
|
|
29
|
+
case "symbol":
|
|
30
30
|
return NaN;
|
|
31
|
-
case
|
|
31
|
+
case "object":
|
|
32
32
|
if (value === null) {
|
|
33
33
|
return NaN;
|
|
34
34
|
}
|
|
35
35
|
// 其他对象类型返回NaN
|
|
36
36
|
return NaN;
|
|
37
|
-
case
|
|
37
|
+
case "undefined":
|
|
38
38
|
return NaN;
|
|
39
39
|
default:
|
|
40
40
|
return NaN;
|
|
@@ -43,7 +43,7 @@ function convertToNumber(value) {
|
|
|
43
43
|
// 主函数实现
|
|
44
44
|
function toFormattedNumber(object, options) {
|
|
45
45
|
// 解构并设置默认值
|
|
46
|
-
const { decimalPlaces = true,
|
|
46
|
+
const { decimalPlaces = true, nanValue = NaN } = options || {};
|
|
47
47
|
/**
|
|
48
48
|
* 格式化单个数字
|
|
49
49
|
* @param num - 要格式化的数字
|
|
@@ -52,7 +52,7 @@ function toFormattedNumber(object, options) {
|
|
|
52
52
|
const formatSingleNumber = (num) => {
|
|
53
53
|
// 处理NaN情况
|
|
54
54
|
if (isNaN(num)) {
|
|
55
|
-
return
|
|
55
|
+
return nanValue;
|
|
56
56
|
}
|
|
57
57
|
// 根据decimalPlaces选项处理小数位
|
|
58
58
|
if (decimalPlaces === true) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toFormattedNumber.js","sourceRoot":"","sources":["../../src/object/toFormattedNumber.ts"],"names":[],"mappings":";;AAAA;;;;GAIG;AACH,SAAS,uBAAuB,CAAC,GAAW;
|
|
1
|
+
{"version":3,"file":"toFormattedNumber.js","sourceRoot":"","sources":["../../src/object/toFormattedNumber.ts"],"names":[],"mappings":";;AAAA;;;;GAIG;AACH,SAAS,uBAAuB,CAAC,GAAW;IAC1C,2BAA2B;IAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC3D,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,KAAc;IACrC,QAAQ,OAAO,KAAK,EAAE,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC;QACf,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;YAC9C,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC;QACD,KAAK,SAAS;YACZ,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,KAAK,UAAU,CAAC;QAChB,KAAK,QAAQ;YACX,OAAO,GAAG,CAAC;QACb,KAAK,QAAQ;YACX,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,OAAO,GAAG,CAAC;YACb,CAAC;YACD,cAAc;YACd,OAAO,GAAG,CAAC;QACb,KAAK,WAAW;YACd,OAAO,GAAG,CAAC;QACb;YACE,OAAO,GAAG,CAAC;IACf,CAAC;AACH,CAAC;AAqED,QAAQ;AACR,SAAS,iBAAiB,CACxB,MAAe,EACf,OAA4D;IAE5D,WAAW;IACX,MAAM,EAAE,aAAa,GAAG,IAAI,EAAE,QAAQ,GAAG,GAAG,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IAE/D;;;;OAIG;IACH,MAAM,kBAAkB,GAAG,CAAC,GAAW,EAAU,EAAE;QACjD,UAAU;QACV,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACf,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,yBAAyB;QACzB,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;YAC3B,gBAAgB;YAChB,OAAO,GAAG,CAAC;QACb,CAAC;aAAM,CAAC;YACN,eAAe;YACf,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC;IAEF;;;;OAIG;IACH,MAAM,YAAY,GAAG,CAAC,KAAc,EAAqB,EAAE;QACzD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,WAAW;YACX,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAa,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,QAAQ;YACR,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YACnC,QAAQ;YACR,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CAAC;IAEF,QAAQ;IACR,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAED,kBAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
declare function toFormattedNumberString(object: unknown[], options?: import('../types/object').ToFormattedNumberStringOptions): string[];
|
|
2
|
+
declare function toFormattedNumberString(object: unknown, options?: import('../types/object').ToFormattedNumberStringOptions): string | string[];
|
|
3
|
+
export default toFormattedNumberString;
|
|
4
|
+
//# sourceMappingURL=toFormattedNumberString.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toFormattedNumberString.d.ts","sourceRoot":"","sources":["../../src/object/toFormattedNumberString.ts"],"names":[],"mappings":"AAuEA,iBAAS,uBAAuB,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,OAAO,iBAAiB,EAAE,8BAA8B,GAAG,MAAM,EAAE,CAAC;AAElI,iBAAS,uBAAuB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,iBAAiB,EAAE,8BAA8B,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC;AAyHzI,eAAe,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
/**
|
|
7
|
+
* 将任意对象转化为格式化的数字字符串
|
|
8
|
+
*
|
|
9
|
+
* 该函数先使用toFormattedNumber将对象转化为数字,再对数字进行字符串格式化
|
|
10
|
+
* 支持多种输入类型,包括数字、字符串、布尔值、null、undefined、数组等
|
|
11
|
+
* 支持深层数组递归处理
|
|
12
|
+
*
|
|
13
|
+
* @param object - 要格式化的对象,可以是任何类型
|
|
14
|
+
* @param options - 格式化选项
|
|
15
|
+
* @param options.decimalPlaces - 保留多少位小数,默认true(保留所有小数位)
|
|
16
|
+
* true: 保留所有小数位,不额外处理
|
|
17
|
+
* number: 保留指定小数位,不够时补0
|
|
18
|
+
* @param options.nanValue - 当值为NaN时的显示,默认'NaN'
|
|
19
|
+
* @param options.zeroValue - 当值为0时的显示,默认'0'
|
|
20
|
+
* @param options.useLocalizedFormat - 是否使用本地化格式,默认false
|
|
21
|
+
* @param options.preProcessor - 预处理函数,在数字转换后、字符串格式化前应用
|
|
22
|
+
* @param options.prefix - 前缀,可以是字符串或函数,默认''
|
|
23
|
+
* 如果是函数,会接收格式化前的数字作为参数,返回字符串作为前缀
|
|
24
|
+
* @param options.suffix - 后缀,可以是字符串或函数,默认''
|
|
25
|
+
* 如果是函数,会接收格式化前的数字作为参数,返回字符串作为后缀
|
|
26
|
+
*
|
|
27
|
+
* @returns 格式化后的数字字符串或字符串数组
|
|
28
|
+
* - 如果输入是单个值,返回格式化后的字符串
|
|
29
|
+
* - 如果输入是数组,返回格式化后的字符串数组
|
|
30
|
+
* - 支持深层数组递归处理
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* // 单个数字值
|
|
35
|
+
* toFormattedNumberString(123.456); // "123.456"
|
|
36
|
+
*
|
|
37
|
+
* // 保留两位小数,不够时补0
|
|
38
|
+
* toFormattedNumberString(123.4, { decimalPlaces: 2 }); // "123.40"
|
|
39
|
+
*
|
|
40
|
+
* // 带前缀后缀
|
|
41
|
+
* toFormattedNumberString(123.456, { prefix: '$', suffix: ' USD' }); // "$123.456 USD"
|
|
42
|
+
*
|
|
43
|
+
* // 本地化格式
|
|
44
|
+
* toFormattedNumberString(1234567.89, { useLocalizedFormat: true }); // "1,234,567.89"
|
|
45
|
+
*
|
|
46
|
+
* // 自定义NaN和0显示
|
|
47
|
+
* toFormattedNumberString(null, { nanValue: 'N/A' }); // "N/A"
|
|
48
|
+
* toFormattedNumberString(0, { zeroValue: '-' }); // "-"
|
|
49
|
+
*
|
|
50
|
+
* // 预处理函数
|
|
51
|
+
* toFormattedNumberString(0.1234, {
|
|
52
|
+
* preProcessor: (num) => num * 100,
|
|
53
|
+
* suffix: '%'
|
|
54
|
+
* }); // "12.34%"
|
|
55
|
+
*
|
|
56
|
+
* // 函数类型前缀
|
|
57
|
+
* toFormattedNumberString(123.456, {
|
|
58
|
+
* prefix: (num) => `$${Math.floor(num)}`
|
|
59
|
+
* }); // "$123123.456"
|
|
60
|
+
*
|
|
61
|
+
* // 函数类型后缀
|
|
62
|
+
* toFormattedNumberString(123.456, {
|
|
63
|
+
* suffix: (num) => `/${num.toFixed(0)}`
|
|
64
|
+
* }); // "123.456/123"
|
|
65
|
+
*
|
|
66
|
+
* // 处理数组
|
|
67
|
+
* toFormattedNumberString([123.456, '789.012'], { decimalPlaces: 2 }); // ["123.46", "789.01"]
|
|
68
|
+
*
|
|
69
|
+
* // 处理深层数组
|
|
70
|
+
* toFormattedNumberString([[1, '1.23'], ['45.67', [89.01, 'abc']]], { decimalPlaces: 2 });
|
|
71
|
+
* // 返回: [["1.00", "1.23"], ["45.67", ["89.01", "NaN"]]]
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
const toFormattedNumber_1 = __importDefault(require("./toFormattedNumber"));
|
|
75
|
+
// 主函数实现
|
|
76
|
+
function toFormattedNumberString(object, options) {
|
|
77
|
+
// 解构并设置默认值
|
|
78
|
+
const { decimalPlaces = true, nanValue = 'NaN', zeroValue = '0', useLocalizedFormat = false, preProcessor, prefix = '', suffix = '' } = options || {};
|
|
79
|
+
/**
|
|
80
|
+
* 处理前缀或后缀,可以是字符串或函数
|
|
81
|
+
* @param prefixOrSuffix - 前缀或后缀,可以是字符串或函数
|
|
82
|
+
* @param num - 要传递给函数的数字
|
|
83
|
+
* @returns 处理后的前缀或后缀字符串
|
|
84
|
+
*/
|
|
85
|
+
const processPrefixSuffix = (prefixOrSuffix, num) => {
|
|
86
|
+
if (typeof prefixOrSuffix === 'function') {
|
|
87
|
+
return prefixOrSuffix(num);
|
|
88
|
+
}
|
|
89
|
+
return prefixOrSuffix;
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* 添加前缀和后缀
|
|
93
|
+
* @param str - 要添加前缀后缀的字符串
|
|
94
|
+
* @param num - 要传递给前缀后缀函数的数字
|
|
95
|
+
* @returns 添加了前缀后缀的字符串
|
|
96
|
+
*/
|
|
97
|
+
const addPrefixSuffix = (str, num) => {
|
|
98
|
+
const processedPrefix = processPrefixSuffix(prefix, num);
|
|
99
|
+
const processedSuffix = processPrefixSuffix(suffix, num);
|
|
100
|
+
return `${processedPrefix}${str}${processedSuffix}`;
|
|
101
|
+
};
|
|
102
|
+
/**
|
|
103
|
+
* 将单个数字转换为格式化字符串
|
|
104
|
+
* @param num - 要转换的数字
|
|
105
|
+
* @returns 格式化后的字符串
|
|
106
|
+
*/
|
|
107
|
+
const convertNumberToString = (num) => {
|
|
108
|
+
// 处理0情况
|
|
109
|
+
if (num === 0) {
|
|
110
|
+
return addPrefixSuffix(zeroValue, num);
|
|
111
|
+
}
|
|
112
|
+
// 应用预处理函数
|
|
113
|
+
const processedNum = preProcessor ? preProcessor(num) : num;
|
|
114
|
+
// 格式化数字为字符串
|
|
115
|
+
let strNum;
|
|
116
|
+
if (useLocalizedFormat) {
|
|
117
|
+
// 使用本地化格式
|
|
118
|
+
if (decimalPlaces === true) {
|
|
119
|
+
// 保留所有小数位
|
|
120
|
+
strNum = processedNum.toLocaleString();
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
// 保留指定小数位,不够时补0
|
|
124
|
+
strNum = processedNum.toLocaleString(undefined, {
|
|
125
|
+
minimumFractionDigits: decimalPlaces,
|
|
126
|
+
maximumFractionDigits: decimalPlaces,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
// 使用非本地化格式
|
|
132
|
+
if (decimalPlaces === true) {
|
|
133
|
+
// 保留所有小数位
|
|
134
|
+
strNum = processedNum.toString();
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
// 保留指定小数位,不够时补0
|
|
138
|
+
strNum = processedNum.toFixed(decimalPlaces);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// 添加前缀和后缀
|
|
142
|
+
return addPrefixSuffix(strNum, processedNum);
|
|
143
|
+
};
|
|
144
|
+
/**
|
|
145
|
+
* 检查字符串是否包含数字
|
|
146
|
+
* @param str - 要检查的字符串
|
|
147
|
+
* @returns 是否包含数字
|
|
148
|
+
*/
|
|
149
|
+
const hasNumbers = (str) => {
|
|
150
|
+
return /\d/.test(str);
|
|
151
|
+
};
|
|
152
|
+
/**
|
|
153
|
+
* 递归处理值,转换为格式化字符串
|
|
154
|
+
* @param value - 要处理的值
|
|
155
|
+
* @returns 格式化后的字符串或字符串数组
|
|
156
|
+
*/
|
|
157
|
+
const processValue = (value) => {
|
|
158
|
+
if (Array.isArray(value)) {
|
|
159
|
+
// 递归处理数组
|
|
160
|
+
return value.map(processValue);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
// 检查是否为无数字的字符串
|
|
164
|
+
if (typeof value === 'string' && !hasNumbers(value)) {
|
|
165
|
+
// 无数字的字符串返回0
|
|
166
|
+
return addPrefixSuffix(zeroValue, 0);
|
|
167
|
+
}
|
|
168
|
+
// 对于其他类型,首先将输入转换为数字
|
|
169
|
+
// 注意:toFormattedNumber对于单个值会返回number类型
|
|
170
|
+
const num = (0, toFormattedNumber_1.default)(value, {
|
|
171
|
+
decimalPlaces,
|
|
172
|
+
nanValue: NaN,
|
|
173
|
+
});
|
|
174
|
+
// 检查是否为NaN
|
|
175
|
+
if (isNaN(num)) {
|
|
176
|
+
// 其他NaN情况,使用nanValue
|
|
177
|
+
return addPrefixSuffix(nanValue, num);
|
|
178
|
+
}
|
|
179
|
+
// 正常数字转换
|
|
180
|
+
return convertNumberToString(num);
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
// 处理输入值
|
|
184
|
+
return processValue(object);
|
|
185
|
+
}
|
|
186
|
+
exports.default = toFormattedNumberString;
|
|
187
|
+
//# sourceMappingURL=toFormattedNumberString.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toFormattedNumberString.js","sourceRoot":"","sources":["../../src/object/toFormattedNumberString.ts"],"names":[],"mappings":";;;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmEG;AACH,4EAAoD;AAMpD,QAAQ;AACR,SAAS,uBAAuB,CAAC,MAAe,EAAE,OAAkE;IAChH,WAAW;IACX,MAAM,EAAE,aAAa,GAAG,IAAI,EAAE,QAAQ,GAAG,KAAK,EAAE,SAAS,GAAG,GAAG,EAAE,kBAAkB,GAAG,KAAK,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IAEtJ;;;;;OAKG;IACH,MAAM,mBAAmB,GAAG,CAAC,cAAoD,EAAE,GAAW,EAAU,EAAE;QACtG,IAAI,OAAO,cAAc,KAAK,UAAU,EAAE,CAAC;YACvC,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,cAAc,CAAC;IAC1B,CAAC,CAAC;IAEF;;;;;OAKG;IACH,MAAM,eAAe,GAAG,CAAC,GAAW,EAAE,GAAW,EAAU,EAAE;QACzD,MAAM,eAAe,GAAG,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACzD,MAAM,eAAe,GAAG,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACzD,OAAO,GAAG,eAAe,GAAG,GAAG,GAAG,eAAe,EAAE,CAAC;IACxD,CAAC,CAAC;IAEF;;;;OAIG;IACH,MAAM,qBAAqB,GAAG,CAAC,GAAW,EAAU,EAAE;QAClD,QAAQ;QACR,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;YACZ,OAAO,eAAe,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC3C,CAAC;QAED,UAAU;QACV,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAE5D,YAAY;QACZ,IAAI,MAAc,CAAC;QACnB,IAAI,kBAAkB,EAAE,CAAC;YACrB,UAAU;YACV,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;gBACzB,UAAU;gBACV,MAAM,GAAG,YAAY,CAAC,cAAc,EAAE,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACJ,gBAAgB;gBAChB,MAAM,GAAG,YAAY,CAAC,cAAc,CAAC,SAAS,EAAE;oBAC5C,qBAAqB,EAAE,aAAa;oBACpC,qBAAqB,EAAE,aAAa;iBACvC,CAAC,CAAC;YACP,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,WAAW;YACX,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;gBACzB,UAAU;gBACV,MAAM,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACJ,gBAAgB;gBAChB,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YACjD,CAAC;QACL,CAAC;QAED,UAAU;QACV,OAAO,eAAe,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACjD,CAAC,CAAC;IAEF;;;;OAIG;IACH,MAAM,UAAU,GAAG,CAAC,GAAW,EAAW,EAAE;QACxC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF;;;;OAIG;IACH,MAAM,YAAY,GAAG,CAAC,KAAc,EAAqB,EAAE;QACvD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,SAAS;YACT,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAa,CAAC;QAC/C,CAAC;aAAM,CAAC;YACJ,eAAe;YACf,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClD,aAAa;gBACb,OAAO,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YACzC,CAAC;YAED,oBAAoB;YACpB,uCAAuC;YACvC,MAAM,GAAG,GAAG,IAAA,2BAAiB,EAAC,KAAK,EAAE;gBACjC,aAAa;gBACb,QAAQ,EAAE,GAAG;aAChB,CAAW,CAAC;YAEb,WAAW;YACX,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACb,qBAAqB;gBACrB,OAAO,eAAe,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAC1C,CAAC;YAED,SAAS;YACT,OAAO,qBAAqB,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC;IACL,CAAC,CAAC;IAEF,QAAQ;IACR,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,kBAAe,uBAAuB,CAAC"}
|
package/dist/types/object.d.ts
CHANGED
|
@@ -17,6 +17,41 @@ export interface ToFormattedNumberOptions extends CommonFormatOptions {
|
|
|
17
17
|
* 当值为NaN时的显示,
|
|
18
18
|
* 默认NaN。
|
|
19
19
|
*/
|
|
20
|
-
|
|
20
|
+
nanValue?: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* toFormattedNumberString 函数的选项接口
|
|
24
|
+
*/
|
|
25
|
+
export interface ToFormattedNumberStringOptions extends CommonFormatOptions {
|
|
26
|
+
/**
|
|
27
|
+
* 当值为NaN时的显示,
|
|
28
|
+
* 默认'NaN'。
|
|
29
|
+
*/
|
|
30
|
+
nanValue?: string;
|
|
31
|
+
/**
|
|
32
|
+
* 当值为0时的显示,
|
|
33
|
+
* 默认'0'。
|
|
34
|
+
*/
|
|
35
|
+
zeroValue?: string;
|
|
36
|
+
/**
|
|
37
|
+
* 是否显示本地化,
|
|
38
|
+
* 默认false。
|
|
39
|
+
*/
|
|
40
|
+
useLocalizedFormat?: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* 预处理函数,在对象被处理为数字后调用,
|
|
43
|
+
* 默认无。
|
|
44
|
+
*/
|
|
45
|
+
preProcessor?: (num: number) => number;
|
|
46
|
+
/**
|
|
47
|
+
* 前缀,可以是字符串或函数,
|
|
48
|
+
* 默认''。
|
|
49
|
+
*/
|
|
50
|
+
prefix?: string | ((value: number) => string);
|
|
51
|
+
/**
|
|
52
|
+
* 后缀,可以是字符串或函数,
|
|
53
|
+
* 默认''。
|
|
54
|
+
*/
|
|
55
|
+
suffix?: string | ((value: number) => string);
|
|
21
56
|
}
|
|
22
57
|
//# sourceMappingURL=object.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/types/object.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,mBAAmB;IACjE;;;OAGG;IACH,
|
|
1
|
+
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/types/object.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,mBAAmB;IACjE;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,8BAA+B,SAAQ,mBAAmB;IACvE;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACvC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IAC9C;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;CACjD"}
|
package/package.json
CHANGED