@planarcat/js-toolkit 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -53,9 +53,12 @@ console.log(formatDate(new Date(), 'dd HH:mm', { locale: 'en-US' }));
53
53
  import { debounce } from '@planarcat/js-toolkit';
54
54
 
55
55
  // 创建防抖函数
56
- const debouncedFn = debounce(() => {
57
- console.log('函数执行了!');
58
- }, { delay: 500 });
56
+ const debouncedFn = debounce(
57
+ () => {
58
+ console.log('函数执行了!');
59
+ },
60
+ { delay: 500 }
61
+ );
59
62
 
60
63
  // 多次调用,只会执行最后一次
61
64
  debouncedFn();
@@ -64,12 +67,79 @@ debouncedFn();
64
67
  // 500ms 后执行一次
65
68
  ```
66
69
 
70
+ ### 数字格式化
71
+
72
+ ```typescript
73
+ import { toFormattedNumber, toFormattedNumberString } from '@planarcat/js-toolkit';
74
+
75
+ // 基本使用
76
+ console.log(toFormattedNumber(1234.5678));
77
+ // 输出: 1234.5678
78
+
79
+ // 保留两位小数
80
+ console.log(toFormattedNumber(1234.5678, { decimalPlaces: 2 }));
81
+ // 输出: 1234.57
82
+
83
+ // 处理字符串
84
+ console.log(toFormattedNumber('123.45abc'));
85
+ // 输出: 123.45
86
+
87
+ // 处理数组
88
+ console.log(toFormattedNumber([123.456, '456.789']));
89
+ // 输出: [123.456, 456.789]
90
+
91
+ // 处理深层数组
92
+ console.log(
93
+ toFormattedNumber([
94
+ [1, '1.23'],
95
+ ['45.67', [89.01, 'abc']],
96
+ ])
97
+ );
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"]
134
+ ```
135
+
67
136
  ## API 文档
68
137
 
69
138
  详细的 API 文档请查看 [docs/](docs/) 目录下的模块文档:
70
139
 
71
140
  - [日期格式化](docs/functions/formatDate.md)
72
141
  - [函数防抖](docs/functions/debounce.md)
142
+ - [数字格式化](docs/functions/toFormattedNumber.md)
73
143
  - [类型定义](docs/interfaces/)
74
144
 
75
145
  ### 生成文档
@@ -92,9 +162,12 @@ src/
92
162
  │ └── formatDate.ts # 日期格式化函数
93
163
  ├── function/
94
164
  │ └── debounce.ts # 函数防抖功能
165
+ ├── object/
166
+ │ └── toFormattedNumber.ts # 数字格式化函数
95
167
  ├── types/
96
168
  │ ├── date.ts # 日期相关类型定义
97
- │ ├── debounce.ts # 防抖相关类型定义
169
+ │ ├── function.ts # 防抖相关类型定义
170
+ │ ├── object.ts # 数字格式化相关类型定义
98
171
  │ └── index.ts # 类型导出
99
172
  ├── utils/
100
173
  │ └── constants.ts # 常量定义
@@ -158,6 +231,22 @@ npm run test:coverage
158
231
 
159
232
  ## 更新日志
160
233
 
234
+ ### v1.4.0
235
+
236
+ - ✨ 优化数字格式化功能,无数字字符串返回 `0` 而不是 `NaN`
237
+ - ✨ 改进 `toFormattedNumberString` 函数,无数字字符串直接返回 `zeroValue`
238
+ - ✨ 完善文档和测试用例
239
+ - ✨ 优化深层数组处理逻辑
240
+
241
+ ### v1.3.0
242
+
243
+ - ✨ 添加数字格式化功能 `toFormattedNumber`
244
+ - ✨ 支持处理任意输入类型(number、string、array、deep array)
245
+ - ✨ 支持自定义小数位数和 NaN 显示
246
+ - ✨ 支持深层数组递归处理
247
+ - ✨ 完善的类型定义和 JSDoc 注释
248
+ - ✨ 新增 object 分类目录结构
249
+
161
250
  ### v1.2.0
162
251
 
163
252
  - ✨ 优化日期格式化功能,支持使用 `dd` 标记直接显示周几
@@ -177,4 +266,4 @@ npm run test:coverage
177
266
  - ✨ 实现日期格式化功能 `formatDate`
178
267
  - ✨ 完整的 TypeScript 类型支持
179
268
  - ✨ 单元测试覆盖
180
- - ✨ 构建和发布配置
269
+ - ✨ 构建和发布配置
@@ -3,7 +3,7 @@ import { DebounceOptions, DebouncedFunction } from "@/types/function";
3
3
  * 将函数进行防抖处理
4
4
  * @param fn - 需要防抖处理的函数
5
5
  * @param delay - 防抖延迟时间,默认100ms
6
- * @param options - 配置选项
6
+ * @param _options - 配置选项(当前未使用)
7
7
  * @returns 防抖处理后的函数,带有cancel方法
8
8
  */
9
9
  declare function debounce<T extends unknown[]>(fn: (...args: T) => void, delay?: number, _options?: DebounceOptions): DebouncedFunction<T>;
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  * 将函数进行防抖处理
5
5
  * @param fn - 需要防抖处理的函数
6
6
  * @param delay - 防抖延迟时间,默认100ms
7
- * @param options - 配置选项
7
+ * @param _options - 配置选项(当前未使用)
8
8
  * @returns 防抖处理后的函数,带有cancel方法
9
9
  */
10
10
  function debounce(fn, delay = 100, _options = {}) {
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 type { ToFormattedNumberOptions } from "./types/object";
13
+ export { default as toFormattedNumberString } from "./object/toFormattedNumberString";
14
+ export type { ToFormattedNumberOptions, ToFormattedNumberStringOptions, } from "./types/object";
14
15
  //# sourceMappingURL=index.d.ts.map
@@ -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,YAAY,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC"}
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;AAGrC,aAAa;AACb,2DAA2D"}
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.nanDisplay - 当值为NaN时的显示,默认NaN
13
+ * @param options.nanValue - 当值为NaN时的显示,默认NaN
14
14
  *
15
15
  * @returns 格式化后的数字或数字数组
16
16
  * - 如果输入是单个值,返回格式化后的数字
@@ -36,21 +36,23 @@
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], NaN, [123, [123, 456]]]
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, { nanDisplay: 0 }); // 0
53
- * toFormattedNumber('abc', { nanDisplay: -1 }); // -1
54
+ * toFormattedNumber(null, { nanValue: 0 }); // 0
55
+ * toFormattedNumber('abc', { nanValue: -1 }); // -1
54
56
  * ```
55
57
  */
56
58
  declare function toFormattedNumber(object: unknown[], options?: import("../types/object").ToFormattedNumberOptions): number[];
@@ -1 +1 @@
1
- {"version":3,"file":"toFormattedNumber.d.ts","sourceRoot":"","sources":["../../src/object/toFormattedNumber.ts"],"names":[],"mappings":"AA0CA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;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"}
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"}
@@ -21,7 +21,7 @@ function convertToNumber(value) {
21
21
  return value;
22
22
  case "string": {
23
23
  const numStr = extractNumberFromString(value);
24
- return numStr ? Number(numStr) : NaN;
24
+ return numStr ? Number(numStr) : 0;
25
25
  }
26
26
  case "boolean":
27
27
  return value ? 1 : 0;
@@ -43,7 +43,7 @@ function convertToNumber(value) {
43
43
  // 主函数实现
44
44
  function toFormattedNumber(object, options) {
45
45
  // 解构并设置默认值
46
- const { decimalPlaces = true, nanDisplay = NaN } = options || {};
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 nanDisplay;
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;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,GAAG,CAAC;QACvC,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;AAmED,QAAQ;AACR,SAAS,iBAAiB,CACxB,MAAe,EACf,OAA4D;IAE5D,WAAW;IACX,MAAM,EAAE,aAAa,GAAG,IAAI,EAAE,UAAU,GAAG,GAAG,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IAEjE;;;;OAIG;IACH,MAAM,kBAAkB,GAAG,CAAC,GAAW,EAAU,EAAE;QACjD,UAAU;QACV,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACf,OAAO,UAAU,CAAC;QACpB,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"}
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"}
@@ -1,24 +1,4 @@
1
- /**
2
- * 将任意对象转化为格式化的数字字符串
3
- *
4
- * @param object - 要格式化的对象,可以是任何类型
5
- * @param options - 格式化选项
6
- * @returns 格式化后的数字字符串或字符串数组
7
- *
8
- * @example
9
- * ```typescript
10
- * // 单个值
11
- * toFormattedNumberString(123.456); // '123.456'
12
- * toFormattedNumberString(123.4, { decimalPlaces: 2 }); // '123.40'
13
- *
14
- * // 数组
15
- * toFormattedNumberString([123.45, '456.7']); // ['123.45', '456.7']
16
- *
17
- * // 带前缀后缀
18
- * toFormattedNumberString(123.45, { prefix: '$', suffix: ' USD' }); // '$123.45 USD'
19
- * ```
20
- */
21
- declare function toFormattedNumberString(object: any[], options?: import('../types/object').ToFormattedNumberStringOptions): string[];
22
- declare function toFormattedNumberString(object: any, options?: import('../types/object').ToFormattedNumberStringOptions): string | string[];
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[];
23
3
  export default toFormattedNumberString;
24
4
  //# sourceMappingURL=toFormattedNumberString.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"toFormattedNumberString.d.ts","sourceRoot":"","sources":["../../src/object/toFormattedNumberString.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,iBAAS,uBAAuB,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE,OAAO,iBAAiB,EAAE,8BAA8B,GAAG,MAAM,EAAE,CAAC;AAC9H,iBAAS,uBAAuB,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,OAAO,iBAAiB,EAAE,8BAA8B,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC;AA0ErI,eAAe,uBAAuB,CAAC"}
1
+ {"version":3,"file":"toFormattedNumberString.d.ts","sourceRoot":"","sources":["../../src/object/toFormattedNumberString.ts"],"names":[],"mappings":"AA2DA,iBAAS,uBAAuB,CAC9B,MAAM,EAAE,OAAO,EAAE,EACjB,OAAO,CAAC,EAAE,OAAO,iBAAiB,EAAE,8BAA8B,GACjE,MAAM,EAAE,CAAC;AAEZ,iBAAS,uBAAuB,CAC9B,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE,OAAO,iBAAiB,EAAE,8BAA8B,GACjE,MAAM,GAAG,MAAM,EAAE,CAAC;AA2GrB,eAAe,uBAAuB,CAAC"}
@@ -3,61 +3,150 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
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
+ * @param options.suffix - 后缀,默认''
24
+ *
25
+ * @returns 格式化后的数字字符串或字符串数组
26
+ * - 如果输入是单个值,返回格式化后的字符串
27
+ * - 如果输入是数组,返回格式化后的字符串数组
28
+ * - 支持深层数组递归处理
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * // 单个数字值
33
+ * toFormattedNumberString(123.456); // "123.456"
34
+ *
35
+ * // 保留两位小数,不够时补0
36
+ * toFormattedNumberString(123.4, { decimalPlaces: 2 }); // "123.40"
37
+ *
38
+ * // 带前缀后缀
39
+ * toFormattedNumberString(123.456, { prefix: '$', suffix: ' USD' }); // "$123.456 USD"
40
+ *
41
+ * // 本地化格式
42
+ * toFormattedNumberString(1234567.89, { useLocalizedFormat: true }); // "1,234,567.89"
43
+ *
44
+ * // 自定义NaN和0显示
45
+ * toFormattedNumberString(null, { nanValue: 'N/A' }); // "N/A"
46
+ * toFormattedNumberString(0, { zeroValue: '-' }); // "-"
47
+ *
48
+ * // 预处理函数
49
+ * toFormattedNumberString(0.1234, {
50
+ * preProcessor: (num) => num * 100,
51
+ * suffix: '%'
52
+ * }); // "12.34%"
53
+ *
54
+ * // 处理数组
55
+ * toFormattedNumberString([123.456, '789.012'], { decimalPlaces: 2 }); // ["123.46", "789.01"]
56
+ *
57
+ * // 处理深层数组
58
+ * toFormattedNumberString([[1, '1.23'], ['45.67', [89.01, 'abc']]], { decimalPlaces: 2 });
59
+ * // 返回: [["1.00", "1.23"], ["45.67", ["89.01", "NaN"]]]
60
+ * ```
61
+ */
6
62
  const toFormattedNumber_1 = __importDefault(require("./toFormattedNumber"));
63
+ // 主函数实现
7
64
  function toFormattedNumberString(object, options) {
8
- const { decimalPlaces = true, nanDisplay = 'NaN', zeroDisplay = '0', useLocale = false, customNumberProcessor, suffix = '', prefix = '' } = options || {};
9
- // 使用 toFormattedNumber 获取未应用decimalPlaces的原始数字
10
- const rawNumbers = (0, toFormattedNumber_1.default)(object, { decimalPlaces: true });
11
- // 应用自定义数字处理方法,支持深层数组
12
- const applyCustomNumberProcessor = (value) => {
13
- if (Array.isArray(value)) {
14
- return value.map(applyCustomNumberProcessor);
15
- }
16
- else {
17
- return customNumberProcessor ? customNumberProcessor(value) : value;
18
- }
19
- };
20
- // 应用自定义数字处理
21
- const processedNumbers = applyCustomNumberProcessor(rawNumbers);
22
- // 将单个值格式化为字符串,支持深层数组
23
- const formatValueToString = (value) => {
24
- if (Array.isArray(value)) {
25
- // 递归处理深层数组
26
- return value.map(formatValueToString);
65
+ // 解构并设置默认值
66
+ const { decimalPlaces = true, nanValue = "NaN", zeroValue = "0", useLocalizedFormat = false, preProcessor, prefix = "", suffix = "", } = options || {};
67
+ /**
68
+ * 将单个数字转换为格式化字符串
69
+ * @param num - 要转换的数字
70
+ * @returns 格式化后的字符串
71
+ */
72
+ const convertNumberToString = (num) => {
73
+ // 处理0情况
74
+ if (num === 0) {
75
+ return zeroValue;
27
76
  }
28
- else {
29
- if (isNaN(value)) {
30
- return `${prefix}${nanDisplay}${suffix}`;
77
+ // 应用预处理函数
78
+ const processedNum = preProcessor ? preProcessor(num) : num;
79
+ // 格式化数字为字符串
80
+ let strNum;
81
+ if (useLocalizedFormat) {
82
+ // 使用本地化格式
83
+ if (decimalPlaces === true) {
84
+ // 保留所有小数位
85
+ strNum = processedNum.toLocaleString();
31
86
  }
32
- if (value === 0) {
33
- return `${prefix}${zeroDisplay}${suffix}`;
87
+ else {
88
+ // 保留指定小数位,不够时补0
89
+ strNum = processedNum.toLocaleString(undefined, {
90
+ minimumFractionDigits: decimalPlaces,
91
+ maximumFractionDigits: decimalPlaces,
92
+ });
34
93
  }
35
- let strNum;
94
+ }
95
+ else {
96
+ // 使用非本地化格式
36
97
  if (decimalPlaces === true) {
37
98
  // 保留所有小数位
38
- strNum = value.toString();
99
+ strNum = processedNum.toString();
39
100
  }
40
101
  else {
41
- // 保留指定小数位,不足补0
42
- strNum = value.toFixed(decimalPlaces);
102
+ // 保留指定小数位,不够时补0
103
+ strNum = processedNum.toFixed(decimalPlaces);
104
+ }
105
+ }
106
+ // 添加前缀和后缀
107
+ return `${prefix}${strNum}${suffix}`;
108
+ };
109
+ /**
110
+ * 检查字符串是否包含数字
111
+ * @param str - 要检查的字符串
112
+ * @returns 是否包含数字
113
+ */
114
+ const hasNumbers = (str) => {
115
+ return /\d/.test(str);
116
+ };
117
+ /**
118
+ * 递归处理值,转换为格式化字符串
119
+ * @param value - 要处理的值
120
+ * @returns 格式化后的字符串或字符串数组
121
+ */
122
+ const processValue = (value) => {
123
+ if (Array.isArray(value)) {
124
+ // 递归处理数组
125
+ return value.map(processValue);
126
+ }
127
+ else {
128
+ // 检查是否为无数字的字符串
129
+ if (typeof value === "string" && !hasNumbers(value)) {
130
+ // 无数字的字符串返回0
131
+ return zeroValue;
43
132
  }
44
- // 应用本地化
45
- if (useLocale) {
46
- const parts = strNum.split('.');
47
- const integerPart = Number(parts[0]).toLocaleString();
48
- if (parts.length > 1) {
49
- strNum = `${integerPart}.${parts[1]}`;
50
- }
51
- else {
52
- strNum = integerPart;
53
- }
133
+ // 对于其他类型,首先将输入转换为数字
134
+ // 注意:toFormattedNumber对于单个值会返回number类型
135
+ const num = (0, toFormattedNumber_1.default)(value, {
136
+ decimalPlaces,
137
+ nanValue: NaN,
138
+ });
139
+ // 检查是否为NaN
140
+ if (isNaN(num)) {
141
+ // 其他NaN情况,使用nanValue
142
+ return nanValue;
54
143
  }
55
- // 添加前缀后缀
56
- return `${prefix}${strNum}${suffix}`;
144
+ // 正常数字转换
145
+ return convertNumberToString(num);
57
146
  }
58
147
  };
59
- // 直接调用格式化函数,它会处理数组和单个值
60
- return formatValueToString(processedNumbers);
148
+ // 处理输入值
149
+ return processValue(object);
61
150
  }
62
151
  exports.default = toFormattedNumberString;
63
152
  //# sourceMappingURL=toFormattedNumberString.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"toFormattedNumberString.js","sourceRoot":"","sources":["../../src/object/toFormattedNumberString.ts"],"names":[],"mappings":";;;;;AAAA,4EAAoD;AAyBpD,SAAS,uBAAuB,CAC5B,MAAW,EACX,OAAkE;IAElE,MAAM,EACF,aAAa,GAAG,IAAI,EACpB,UAAU,GAAG,KAAK,EAClB,WAAW,GAAG,GAAG,EACjB,SAAS,GAAG,KAAK,EACjB,qBAAqB,EACrB,MAAM,GAAG,EAAE,EACX,MAAM,GAAG,EAAE,EACd,GAAG,OAAO,IAAI,EAAE,CAAC;IAElB,+CAA+C;IAC/C,MAAM,UAAU,GAAG,IAAA,2BAAiB,EAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtE,qBAAqB;IACrB,MAAM,0BAA0B,GAAG,CAAC,KAAwB,EAAqB,EAAE;QAC/E,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAa,CAAC;QAC7D,CAAC;aAAM,CAAC;YACJ,OAAO,qBAAqB,CAAC,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACxE,CAAC;IACL,CAAC,CAAC;IAEF,YAAY;IACZ,MAAM,gBAAgB,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAC;IAEhE,qBAAqB;IACrB,MAAM,mBAAmB,GAAG,CAAC,KAAwB,EAAqB,EAAE;QACxE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,WAAW;YACX,OAAO,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAa,CAAC;QACtD,CAAC;aAAM,CAAC;YACJ,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,EAAE,CAAC;YAC7C,CAAC;YAED,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBACd,OAAO,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,EAAE,CAAC;YAC9C,CAAC;YAED,IAAI,MAAc,CAAC;YAEnB,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;gBACzB,UAAU;gBACV,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACJ,eAAe;gBACf,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC1C,CAAC;YAED,QAAQ;YACR,IAAI,SAAS,EAAE,CAAC;gBACZ,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAChC,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC;gBACtD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACnB,MAAM,GAAG,GAAG,WAAW,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1C,CAAC;qBAAM,CAAC;oBACJ,MAAM,GAAG,WAAW,CAAC;gBACzB,CAAC;YACL,CAAC;YAED,SAAS;YACT,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC;QACzC,CAAC;IACL,CAAC,CAAC;IAEF,uBAAuB;IACvB,OAAO,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;AACjD,CAAC;AAED,kBAAe,uBAAuB,CAAC"}
1
+ {"version":3,"file":"toFormattedNumberString.js","sourceRoot":"","sources":["../../src/object/toFormattedNumberString.ts"],"names":[],"mappings":";;;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,4EAAoD;AAYpD,QAAQ;AACR,SAAS,uBAAuB,CAC9B,MAAe,EACf,OAAkE;IAElE,WAAW;IACX,MAAM,EACJ,aAAa,GAAG,IAAI,EACpB,QAAQ,GAAG,KAAK,EAChB,SAAS,GAAG,GAAG,EACf,kBAAkB,GAAG,KAAK,EAC1B,YAAY,EACZ,MAAM,GAAG,EAAE,EACX,MAAM,GAAG,EAAE,GACZ,GAAG,OAAO,IAAI,EAAE,CAAC;IAElB;;;;OAIG;IACH,MAAM,qBAAqB,GAAG,CAAC,GAAW,EAAU,EAAE;QACpD,QAAQ;QACR,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;YACd,OAAO,SAAS,CAAC;QACnB,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;YACvB,UAAU;YACV,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;gBAC3B,UAAU;gBACV,MAAM,GAAG,YAAY,CAAC,cAAc,EAAE,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,gBAAgB;gBAChB,MAAM,GAAG,YAAY,CAAC,cAAc,CAAC,SAAS,EAAE;oBAC9C,qBAAqB,EAAE,aAAa;oBACpC,qBAAqB,EAAE,aAAa;iBACrC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,CAAC;YACN,WAAW;YACX,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;gBAC3B,UAAU;gBACV,MAAM,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,gBAAgB;gBAChB,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,UAAU;QACV,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC;IACvC,CAAC,CAAC;IAEF;;;;OAIG;IACH,MAAM,UAAU,GAAG,CAAC,GAAW,EAAW,EAAE;QAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC,CAAC;IAEF;;;;OAIG;IACH,MAAM,YAAY,GAAG,CAAC,KAAc,EAAqB,EAAE;QACzD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,SAAS;YACT,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAa,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,eAAe;YACf,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpD,aAAa;gBACb,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,oBAAoB;YACpB,uCAAuC;YACvC,MAAM,GAAG,GAAG,IAAA,2BAAiB,EAAC,KAAK,EAAE;gBACnC,aAAa;gBACb,QAAQ,EAAE,GAAG;aACd,CAAW,CAAC;YAEb,WAAW;YACX,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACf,qBAAqB;gBACrB,OAAO,QAAQ,CAAC;YAClB,CAAC;YAED,SAAS;YACT,OAAO,qBAAqB,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC;IAEF,QAAQ;IACR,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAED,kBAAe,uBAAuB,CAAC"}
@@ -17,6 +17,41 @@ export interface ToFormattedNumberOptions extends CommonFormatOptions {
17
17
  * 当值为NaN时的显示,
18
18
  * 默认NaN。
19
19
  */
20
- nanDisplay?: number;
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;
51
+ /**
52
+ * 后缀,
53
+ * 默认''。
54
+ */
55
+ suffix?: 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;IAClC;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,mBAAmB;IACnE;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
1
+ {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/types/object.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,mBAAmB;IACnE;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,8BAA+B,SAAQ,mBAAmB;IACzE;;;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,CAAC;IAChB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@planarcat/js-toolkit",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "一个自用的带学习性质的(目前)现代化的 JavaScript/TypeScript 实用工具库,提供类型安全、高性能的常用函数,包括对象转换、日期处理、函数优化等开发常用工具。",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1,49 +0,0 @@
1
- import { ToFormattedNumberOptions, ToFormattedNumberStringOptions } from '../types/object';
2
- /**
3
- * 将任意对象转化为数字,然后根据格式化参数对转化后的数字进行格式化
4
- *
5
- * @param object - 要格式化的对象,可以是任何类型
6
- * @param options - 格式化选项
7
- * @returns 格式化后的数字或数字数组
8
- *
9
- * @example
10
- * ```typescript
11
- * // 单个值
12
- * toFormattedNumber(123.456); // 123.456
13
- * toFormattedNumber('123.456abc'); // 123.456
14
- * toFormattedNumber(true); // 1
15
- * toFormattedNumber(null); // NaN
16
- *
17
- * // 数组
18
- * toFormattedNumber([123.456, '456.789def']); // [123.456, 456.789]
19
- *
20
- * // 保留指定小数位
21
- * toFormattedNumber(123.456, { decimalPlaces: 2 }); // 123.46
22
- * ```
23
- */
24
- declare function toFormattedNumber(object: any[], options?: ToFormattedNumberOptions): number[];
25
- declare function toFormattedNumber(object: any, options?: ToFormattedNumberOptions): number;
26
- /**
27
- * 将任意对象转化为格式化的数字字符串
28
- *
29
- * @param object - 要格式化的对象,可以是任何类型
30
- * @param options - 格式化选项
31
- * @returns 格式化后的数字字符串或字符串数组
32
- *
33
- * @example
34
- * ```typescript
35
- * // 单个值
36
- * toFormattedNumberString(123.456); // '123.456'
37
- * toFormattedNumberString(123.4, { decimalPlaces: 2 }); // '123.40'
38
- *
39
- * // 数组
40
- * toFormattedNumberString([123.45, '456.7']); // ['123.45', '456.7']
41
- *
42
- * // 带前缀后缀
43
- * toFormattedNumberString(123.45, { prefix: '$', suffix: ' USD' }); // '$123.45 USD'
44
- * ```
45
- */
46
- declare function toFormattedNumberString(object: any[], options?: ToFormattedNumberStringOptions): string[];
47
- declare function toFormattedNumberString(object: any, options?: ToFormattedNumberStringOptions): string;
48
- export { toFormattedNumber, toFormattedNumberString };
49
- //# sourceMappingURL=toFormatNumber.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"toFormatNumber.d.ts","sourceRoot":"","sources":["../../src/object/toFormatNumber.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AA2C3F;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,iBAAS,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE,wBAAwB,GAAG,MAAM,EAAE,CAAC;AACxF,iBAAS,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,wBAAwB,GAAG,MAAM,CAAC;AAsCpF;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,iBAAS,uBAAuB,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE,8BAA8B,GAAG,MAAM,EAAE,CAAC;AACpG,iBAAS,uBAAuB,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,8BAA8B,GAAG,MAAM,CAAC;AAoEhG,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,CAAC"}
@@ -1,125 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.toFormattedNumberString = exports.toFormattedNumber = void 0;
4
- /**
5
- * 从字符串中提取数字部分
6
- * @param str - 输入字符串
7
- * @returns 提取的数字字符串
8
- */
9
- function extractNumberFromString(str) {
10
- // 匹配数字体系:0~9,小数点,正负号等
11
- const match = str.match(/[-+]?\d*\.?\d+/);
12
- return match ? match[0] : '';
13
- }
14
- /**
15
- * 将单个值转换为数字
16
- * @param value - 输入值
17
- * @returns 转换后的数字
18
- */
19
- function convertToNumber(value) {
20
- switch (typeof value) {
21
- case 'number':
22
- return value;
23
- case 'string':
24
- const numStr = extractNumberFromString(value);
25
- return numStr ? Number(numStr) : NaN;
26
- case 'boolean':
27
- return value ? 1 : 0;
28
- case 'function':
29
- case 'symbol':
30
- return NaN;
31
- case 'object':
32
- if (value === null) {
33
- return NaN;
34
- }
35
- // 其他对象类型返回NaN
36
- return NaN;
37
- case 'undefined':
38
- return NaN;
39
- default:
40
- return NaN;
41
- }
42
- }
43
- function toFormattedNumber(object, options) {
44
- const { decimalPlaces = true, nanDisplay = NaN } = options || {};
45
- // 格式化单个数字
46
- const formatSingleNumber = (num) => {
47
- if (isNaN(num)) {
48
- return nanDisplay;
49
- }
50
- if (decimalPlaces === true) {
51
- // 保留所有小数位
52
- return num;
53
- }
54
- else {
55
- // 保留指定小数位
56
- return Number(num.toFixed(decimalPlaces));
57
- }
58
- };
59
- // 转换单个值
60
- const processSingleValue = (value) => {
61
- const num = convertToNumber(value);
62
- return formatSingleNumber(num);
63
- };
64
- // 检查是否为数组
65
- if (Array.isArray(object)) {
66
- // 数组处理,返回数字数组
67
- return object.map(processSingleValue);
68
- }
69
- else {
70
- // 单个值处理,返回数字
71
- return processSingleValue(object);
72
- }
73
- }
74
- exports.toFormattedNumber = toFormattedNumber;
75
- function toFormattedNumberString(object, options) {
76
- const { decimalPlaces = true, nanDisplay = 'NaN', zeroDisplay = '0', useLocale = false, customFormatter, suffix = '', prefix = '' } = options || {};
77
- // 使用 toFormattedNumber 获取格式化后的数字
78
- const numbers = toFormattedNumber(object, { decimalPlaces });
79
- // 将单个数字格式化为字符串
80
- const formatNumberToString = (num) => {
81
- if (isNaN(num)) {
82
- return nanDisplay;
83
- }
84
- if (num === 0) {
85
- return zeroDisplay;
86
- }
87
- let strNum;
88
- if (decimalPlaces === true) {
89
- // 保留所有小数位
90
- strNum = num.toString();
91
- }
92
- else {
93
- // 保留指定小数位,不足补0
94
- strNum = num.toFixed(decimalPlaces);
95
- }
96
- // 应用本地化
97
- if (useLocale) {
98
- const parts = strNum.split('.');
99
- const integerPart = Number(parts[0]).toLocaleString();
100
- if (parts.length > 1) {
101
- strNum = `${integerPart}.${parts[1]}`;
102
- }
103
- else {
104
- strNum = integerPart;
105
- }
106
- }
107
- // 应用自定义处理函数
108
- if (customFormatter) {
109
- strNum = customFormatter(num);
110
- }
111
- // 添加前缀后缀
112
- return `${prefix}${strNum}${suffix}`;
113
- };
114
- // 处理结果
115
- if (Array.isArray(numbers)) {
116
- // 数组处理,返回字符串数组
117
- return numbers.map(formatNumberToString);
118
- }
119
- else {
120
- // 单个值处理,返回字符串
121
- return formatNumberToString(numbers);
122
- }
123
- }
124
- exports.toFormattedNumberString = toFormattedNumberString;
125
- //# sourceMappingURL=toFormatNumber.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"toFormatNumber.js","sourceRoot":"","sources":["../../src/object/toFormatNumber.ts"],"names":[],"mappings":"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"}
@@ -1,18 +0,0 @@
1
- export interface DebounceOptions {
2
- /**
3
- * 防抖延迟时间,默认500ms
4
- */
5
- delay?: number;
6
- }
7
- /**
8
- * 防抖处理后的函数接口
9
- * @template T - 函数类型
10
- */
11
- export interface DebouncedFunction<T extends unknown[]> {
12
- (...args: T): void;
13
- /**
14
- * 取消当前正在执行的函数调用
15
- */
16
- cancel(): void;
17
- }
18
- //# sourceMappingURL=debounce.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"debounce.d.ts","sourceRoot":"","sources":["../../src/types/debounce.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC,SAAS,OAAO,EAAE;IACpD,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACnB;;OAEG;IACH,MAAM,IAAI,IAAI,CAAC;CAChB"}
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=debounce.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"debounce.js","sourceRoot":"","sources":["../../src/types/debounce.ts"],"names":[],"mappings":""}