@planarcat/js-toolkit 1.5.5 → 1.6.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
@@ -248,6 +248,30 @@ npm run test:coverage
248
248
 
249
249
  ## 更新日志
250
250
 
251
+ ### v1.6.0
252
+
253
+ - ✨ 增强了日期格式化功能,支持更多格式化标记
254
+ - ✨ 新增月份相关标记:`MMMM`(完整月份名称)、`MMM`(月份缩写)
255
+ - ✨ 新增日期相关标记:`DDD`(一年中的第几天)、`Do`(带序数词的日期)
256
+ - ✨ 新增时间相关标记:`S`(单个毫秒)
257
+ - ✨ 新增星期相关标记:`dddd`(完整星期名称)、`ddd`(星期缩写)
258
+ - ✨ 新增时间戳相关标记:`X`(Unix时间戳秒)、`x`(Unix时间戳毫秒)
259
+ - ✨ 优化了文档结构,添加了完整的格式化标记参考
260
+ - ✨ 完善了测试用例,覆盖所有新功能
261
+
262
+ ### v1.5.6
263
+
264
+ - ✨ 优化了 `toFormattedNumberString` 函数的内部实现,将内部函数提取到外部
265
+ - ✨ 统一了变量命名规范,根据转化进度命名:converted、preProcessed、formatted
266
+ - ✨ 新增测试用例,验证预处理函数和后缀函数的组合使用
267
+ - ✨ 提高了代码的可读性和可维护性
268
+
269
+ ### v1.5.5
270
+
271
+ - ✨ 修复了测试文件中的未使用变量警告
272
+ - ✨ 优化了代码注释,删除了重复的不必要说明
273
+ - ✨ 提高了代码的简洁性和可维护性
274
+
251
275
  ### v1.5.3
252
276
 
253
277
  - ✨ 增强了 `toFormattedNumberString` 函数,为 `preProcessor`、`prefix` 和 `suffix` 函数更新了参数顺序
@@ -1,4 +1,4 @@
1
- import { DateInput, DateFormatOptions } from "../types/date";
1
+ import { DateFormatOptions, DateInput } from '../types/date';
2
2
  /**
3
3
  * 格式化日期对象
4
4
  *
@@ -18,23 +18,53 @@ import { DateInput, DateFormatOptions } from "../types/date";
18
18
  * // 自定义格式
19
19
  * formatDate('2023-12-25', 'YYYY年MM月DD日');
20
20
  * // 返回: "2023年12月25日"
21
- *
22
- * // 使用 dd 标记显示周几
23
- * formatDate(new Date(), 'dd HH:mm');
24
- * // 返回: "周一 14:30"
25
- *
26
- * // 英文环境显示周几
27
- * formatDate(new Date(), 'dd HH:mm', { locale: 'en-US' });
28
- * // 返回: "Monday 14:30"
29
- *
30
- * // 自定义格式化器
31
- * formatDate(new Date(), '第Q季度', {
32
- * customFormatters: {
33
- * '第Q季度': (date) => `第${Math.floor((date.getMonth() + 3) / 3)}季度`
34
- * }
35
- * });
36
- * // 返回: "第4季度"
37
21
  * ```
22
+ *
23
+ * @remarks
24
+ * ## 支持的格式化标记
25
+ *
26
+ * ### 年份
27
+ * - `YYYY`: 4位年份 (2024)
28
+ * - `YY`: 2位年份 (24)
29
+ *
30
+ * ### 月份
31
+ * - `MMMM`: 完整月份名称 (January / 一月)
32
+ * - `MMM`: 月份缩写 (Jan / 1月)
33
+ * - `MM`: 2位月份 (01-12)
34
+ * - `M`: 1-2位月份 (1-12)
35
+ *
36
+ * ### 日期
37
+ * - `DDD`: 一年中的第几天 (001-366)
38
+ * - `DD`: 2位日期 (01-31)
39
+ * - `D`: 1-2位日期 (1-31)
40
+ * - `Do`: 带序数词的日期 (1st, 2nd, 3rd, 4th / 1日, 2日, 3日)
41
+ *
42
+ * ### 星期
43
+ * - `dddd`: 完整星期名称 (Monday / 星期一)
44
+ * - `ddd`: 星期缩写 (Mon / 周一)
45
+ * - `d`: 星期数字 (0-6, 0=周日)
46
+ *
47
+ * ### 时间
48
+ * - `HH`: 24小时制,2位 (00-23)
49
+ * - `H`: 24小时制,1-2位 (0-23)
50
+ * - `hh`: 12小时制,2位 (01-12)
51
+ * - `h`: 12小时制,1-2位 (1-12)
52
+ * - `mm`: 2位分钟 (00-59)
53
+ * - `m`: 1-2位分钟 (0-59)
54
+ * - `ss`: 2位秒 (00-59)
55
+ * - `s`: 1-2位秒 (0-59)
56
+ * - `SSS`: 3位毫秒 (000-999)
57
+ * - `S`: 毫秒 (0-999)
58
+ *
59
+ * ### 其他
60
+ * - `A`: 大写AM/PM
61
+ * - `a`: 小写am/pm
62
+ * - `Q`: 季度 (1-4)
63
+ * - `WW`: 2位周数 (01-53)
64
+ * - `W`: 1-2位周数 (1-53)
65
+ * - `X`: Unix时间戳 (秒)
66
+ * - `x`: Unix时间戳 (毫秒)
67
+ * - `timestamp`: Unix时间戳 (毫秒,与x相同)
38
68
  */
39
69
  declare function formatDate(input: DateInput, formatStr?: string, options?: Partial<DateFormatOptions>): string;
40
70
  export default formatDate;
@@ -1 +1 @@
1
- {"version":3,"file":"formatDate.d.ts","sourceRoot":"","sources":["../../src/date/formatDate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AA4D7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,iBAAS,UAAU,CACjB,KAAK,EAAE,SAAS,EAChB,SAAS,GAAE,MAA8B,EACzC,OAAO,GAAE,OAAO,CAAC,iBAAiB,CAAM,GACvC,MAAM,CAuFR;AAED,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"formatDate.d.ts","sourceRoot":"","sources":["../../src/date/formatDate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAoD7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkEG;AACH,iBAAS,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,GAAE,MAA8B,EAAE,OAAO,GAAE,OAAO,CAAC,iBAAiB,CAAM,GAAG,MAAM,CAqHjI;AAED,eAAe,UAAU,CAAC"}
@@ -11,7 +11,7 @@ function safeParseDate(input) {
11
11
  if (input instanceof Date && !isNaN(input.getTime())) {
12
12
  return input;
13
13
  }
14
- if (typeof input === "string" || typeof input === "number") {
14
+ if (typeof input === 'string' || typeof input === 'number') {
15
15
  const date = new Date(input);
16
16
  if (!isNaN(date.getTime())) {
17
17
  return date;
@@ -42,9 +42,8 @@ function getWeekNumber(date) {
42
42
  * @internal
43
43
  */
44
44
  function getLocalizedWeekday(weekday, options) {
45
- const lang = options.locale?.split("-")[0] || "zh";
46
- return (constants_1.WEEKDAY_MAP[lang]?.[weekday] ||
47
- constants_1.WEEKDAY_MAP.zh[weekday]);
45
+ const lang = options.locale?.split('-')[0] || 'zh';
46
+ return constants_1.WEEKDAY_MAP[lang]?.[weekday] || constants_1.WEEKDAY_MAP.zh[weekday];
48
47
  }
49
48
  /**
50
49
  * 格式化日期对象
@@ -65,25 +64,55 @@ function getLocalizedWeekday(weekday, options) {
65
64
  * // 自定义格式
66
65
  * formatDate('2023-12-25', 'YYYY年MM月DD日');
67
66
  * // 返回: "2023年12月25日"
67
+ * ```
68
68
  *
69
- * // 使用 dd 标记显示周几
70
- * formatDate(new Date(), 'dd HH:mm');
71
- * // 返回: "周一 14:30"
69
+ * @remarks
70
+ * ## 支持的格式化标记
72
71
  *
73
- * // 英文环境显示周几
74
- * formatDate(new Date(), 'dd HH:mm', { locale: 'en-US' });
75
- * // 返回: "Monday 14:30"
72
+ * ### 年份
73
+ * - `YYYY`: 4位年份 (2024)
74
+ * - `YY`: 2位年份 (24)
76
75
  *
77
- * // 自定义格式化器
78
- * formatDate(new Date(), '第Q季度', {
79
- * customFormatters: {
80
- * '第Q季度': (date) => `第${Math.floor((date.getMonth() + 3) / 3)}季度`
81
- * }
82
- * });
83
- * // 返回: "第4季度"
84
- * ```
76
+ * ### 月份
77
+ * - `MMMM`: 完整月份名称 (January / 一月)
78
+ * - `MMM`: 月份缩写 (Jan / 1月)
79
+ * - `MM`: 2位月份 (01-12)
80
+ * - `M`: 1-2位月份 (1-12)
81
+ *
82
+ * ### 日期
83
+ * - `DDD`: 一年中的第几天 (001-366)
84
+ * - `DD`: 2位日期 (01-31)
85
+ * - `D`: 1-2位日期 (1-31)
86
+ * - `Do`: 带序数词的日期 (1st, 2nd, 3rd, 4th / 1日, 2日, 3日)
87
+ *
88
+ * ### 星期
89
+ * - `dddd`: 完整星期名称 (Monday / 星期一)
90
+ * - `ddd`: 星期缩写 (Mon / 周一)
91
+ * - `d`: 星期数字 (0-6, 0=周日)
92
+ *
93
+ * ### 时间
94
+ * - `HH`: 24小时制,2位 (00-23)
95
+ * - `H`: 24小时制,1-2位 (0-23)
96
+ * - `hh`: 12小时制,2位 (01-12)
97
+ * - `h`: 12小时制,1-2位 (1-12)
98
+ * - `mm`: 2位分钟 (00-59)
99
+ * - `m`: 1-2位分钟 (0-59)
100
+ * - `ss`: 2位秒 (00-59)
101
+ * - `s`: 1-2位秒 (0-59)
102
+ * - `SSS`: 3位毫秒 (000-999)
103
+ * - `S`: 毫秒 (0-999)
104
+ *
105
+ * ### 其他
106
+ * - `A`: 大写AM/PM
107
+ * - `a`: 小写am/pm
108
+ * - `Q`: 季度 (1-4)
109
+ * - `WW`: 2位周数 (01-53)
110
+ * - `W`: 1-2位周数 (1-53)
111
+ * - `X`: Unix时间戳 (秒)
112
+ * - `x`: Unix时间戳 (毫秒)
113
+ * - `timestamp`: Unix时间戳 (毫秒,与x相同)
85
114
  */
86
- function formatDate(input, formatStr = "YYYY-MM-DD HH:mm:ss", options = {}) {
115
+ function formatDate(input, formatStr = 'YYYY-MM-DD HH:mm:ss', options = {}) {
87
116
  const date = safeParseDate(input);
88
117
  const mergedOptions = { ...constants_1.DEFAULT_DATE_FORMAT_OPTIONS, ...options };
89
118
  // 获取日期各部分
@@ -97,41 +126,70 @@ function formatDate(input, formatStr = "YYYY-MM-DD HH:mm:ss", options = {}) {
97
126
  const weekday = date.getDay();
98
127
  const quarter = Math.floor((date.getMonth() + 3) / 3);
99
128
  const weekNumber = getWeekNumber(date);
129
+ // 一年中的第几天
130
+ const firstDayOfYear = new Date(year, 0, 1);
131
+ const dayOfYear = Math.ceil((date.getTime() - firstDayOfYear.getTime()) / (1000 * 60 * 60 * 24));
132
+ // 序数词后缀
133
+ const getOrdinalSuffix = (num) => {
134
+ const suffixes = ['th', 'st', 'nd', 'rd'];
135
+ const v = num % 100;
136
+ return suffixes[(v - 20) % 10] || suffixes[v] || suffixes[0];
137
+ };
138
+ // Unix 时间戳
139
+ const timestampSeconds = Math.floor(date.getTime() / 1000);
140
+ const timestampMilliseconds = date.getTime();
141
+ // 月份名称和缩写
142
+ const getMonthName = (date, locale, full = false) => {
143
+ return date.toLocaleString(locale, { month: full ? 'long' : 'short' });
144
+ };
145
+ // 星期名称和缩写
146
+ const getWeekdayName = (date, locale, full = false) => {
147
+ return date.toLocaleString(locale, { weekday: full ? 'long' : 'short' });
148
+ };
100
149
  // 12小时制
101
150
  const hours12 = hours % 12 || 12;
102
- const ampm = hours < 12 ? "AM" : "PM";
151
+ const ampm = hours < 12 ? 'AM' : 'PM';
103
152
  const ampmLower = ampm.toLowerCase();
104
153
  // 1. 首先处理完整的单词标记(如 timestamp)
105
154
  let result = formatStr;
106
155
  // 优先替换 timestamp,避免被拆解
107
- if (result.includes("timestamp")) {
156
+ if (result.includes('timestamp')) {
108
157
  result = result.replace(/timestamp/g, date.getTime().toString());
109
158
  }
110
159
  // 2. 应用自定义格式化器(优先级最高)
111
160
  if (mergedOptions.customFormatters) {
112
161
  Object.entries(mergedOptions.customFormatters).forEach(([token, formatter]) => {
113
- const escapedToken = token.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
114
- const regex = new RegExp(`(?<![a-zA-Z0-9])${escapedToken}(?![a-zA-Z0-9])`, "g");
162
+ const escapedToken = token.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
163
+ const regex = new RegExp(`(?<![a-zA-Z0-9])${escapedToken}(?![a-zA-Z0-9])`, 'g');
115
164
  result = result.replace(regex, formatter(date));
116
165
  });
117
166
  }
118
167
  // 3. 替换多字符标记(2-4个字符)
168
+ // 注意:长标记需要先于短标记处理,避免被部分匹配
119
169
  const multiCharReplacements = {
120
- YYYY: year.toString().padStart(4, "0"),
170
+ YYYY: year.toString().padStart(4, '0'),
121
171
  YY: year.toString().slice(-2),
122
- MM: month.toString().padStart(2, "0"),
123
- DD: day.toString().padStart(2, "0"),
124
- HH: hours.toString().padStart(2, "0"),
125
- hh: hours12.toString().padStart(2, "0"),
126
- mm: minutes.toString().padStart(2, "0"),
127
- ss: seconds.toString().padStart(2, "0"),
128
- SSS: milliseconds.toString().padStart(3, "0"),
129
- WW: weekNumber.toString().padStart(2, "0"),
172
+ MMMM: getMonthName(date, mergedOptions.locale || constants_1.DEFAULT_DATE_FORMAT_OPTIONS.locale, true),
173
+ MMM: getMonthName(date, mergedOptions.locale || constants_1.DEFAULT_DATE_FORMAT_OPTIONS.locale, false),
174
+ MM: month.toString().padStart(2, '0'),
175
+ DDD: dayOfYear.toString().padStart(3, '0'),
176
+ DD: day.toString().padStart(2, '0'),
177
+ HH: hours.toString().padStart(2, '0'),
178
+ hh: hours12.toString().padStart(2, '0'),
179
+ mm: minutes.toString().padStart(2, '0'),
180
+ ss: seconds.toString().padStart(2, '0'),
181
+ SSS: milliseconds.toString().padStart(3, '0'),
182
+ WW: weekNumber.toString().padStart(2, '0'),
183
+ dddd: getWeekdayName(date, mergedOptions.locale || constants_1.DEFAULT_DATE_FORMAT_OPTIONS.locale, true),
184
+ ddd: getWeekdayName(date, mergedOptions.locale || constants_1.DEFAULT_DATE_FORMAT_OPTIONS.locale, false),
130
185
  dd: getLocalizedWeekday(weekday, mergedOptions),
186
+ Do: `${day}${getOrdinalSuffix(day)}`,
187
+ X: timestampSeconds.toString(),
188
+ x: timestampMilliseconds.toString(),
131
189
  };
132
190
  Object.entries(multiCharReplacements).forEach(([token, value]) => {
133
191
  // 使用单词边界或字符串边界来确保精确匹配
134
- const regex = new RegExp(`\\b${token}\\b|${token}(?![a-zA-Z0-9])`, "g");
192
+ const regex = new RegExp(`\\b${token}\\b|${token}(?![a-zA-Z0-9])`, 'g');
135
193
  result = result.replace(regex, value);
136
194
  });
137
195
  // 4. 替换单字符标记(使用更精确的匹配)
@@ -143,6 +201,7 @@ function formatDate(input, formatStr = "YYYY-MM-DD HH:mm:ss", options = {}) {
143
201
  h: hours12.toString(),
144
202
  m: minutes.toString(),
145
203
  s: seconds.toString(),
204
+ S: milliseconds.toString(),
146
205
  W: weekNumber.toString(),
147
206
  d: weekday.toString(),
148
207
  Q: quarter.toString(),
@@ -151,7 +210,7 @@ function formatDate(input, formatStr = "YYYY-MM-DD HH:mm:ss", options = {}) {
151
210
  };
152
211
  Object.entries(singleCharReplacements).forEach(([token, value]) => {
153
212
  // 单字符需要更精确的匹配:前面是边界或特定字符,后面不是相同字符
154
- const regex = new RegExp(`(?<![a-zA-Z0-9])${token}(?![a-zA-Z0-9])`, "g");
213
+ const regex = new RegExp(`(?<![a-zA-Z0-9])${token}(?![a-zA-Z0-9])`, 'g');
155
214
  result = result.replace(regex, value);
156
215
  });
157
216
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"formatDate.js","sourceRoot":"","sources":["../../src/date/formatDate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"formatDate.js","sourceRoot":"","sources":["../../src/date/formatDate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * 编译模式日期格式化实现
3
+ * 首次调用编译格式化字符串,后续调用使用缓存的编译函数
4
+ */
5
+ import { DateFormatOptions, DateInput } from '../types/date';
6
+ /**
7
+ * 编译后的格式化函数类型
8
+ */
9
+ type CompiledFormatter = (date: Date, options: DateFormatOptions) => string;
10
+ /**
11
+ * 编译格式化字符串,生成优化的格式化函数
12
+ * @param formatStr - 格式化字符串
13
+ * @returns 编译后的格式化函数
14
+ */
15
+ export declare function compileFormat(formatStr: string): CompiledFormatter;
16
+ /**
17
+ * 清除格式化缓存
18
+ * @param formatStr - 可选,指定要清除的格式化字符串缓存
19
+ */
20
+ export declare function clearFormatCache(formatStr?: string): void;
21
+ /**
22
+ * 编译模式日期格式化
23
+ * @param input - 要格式化的日期输入
24
+ * @param formatStr - 格式化字符串
25
+ * @param options - 格式化选项
26
+ * @returns 格式化后的日期字符串
27
+ */
28
+ export declare function formatDateCompiled(input: DateInput, formatStr?: string, options?: Partial<DateFormatOptions>): string;
29
+ export default formatDateCompiled;
30
+ //# sourceMappingURL=formatDateCompiled.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatDateCompiled.d.ts","sourceRoot":"","sources":["../../src/date/formatDateCompiled.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAI7D;;GAEG;AACH,KAAK,iBAAiB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,iBAAiB,KAAK,MAAM,CAAC;AAO5E;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,CA0FlE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAMzD;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAC9B,KAAK,EAAE,SAAS,EAChB,SAAS,GAAE,MAA8B,EACzC,OAAO,GAAE,OAAO,CAAC,iBAAiB,CAAM,GACzC,MAAM,CASR;AAED,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatDateCompiled = exports.clearFormatCache = exports.compileFormat = void 0;
4
+ const constants_1 = require("../utils/constants");
5
+ const formatDatePlain_1 = require("./formatDatePlain");
6
+ /**
7
+ * 格式化缓存,用于存储编译后的格式化函数
8
+ */
9
+ const FORMAT_CACHE = new Map();
10
+ /**
11
+ * 编译格式化字符串,生成优化的格式化函数
12
+ * @param formatStr - 格式化字符串
13
+ * @returns 编译后的格式化函数
14
+ */
15
+ function compileFormat(formatStr) {
16
+ // 检查缓存
17
+ if (FORMAT_CACHE.has(formatStr)) {
18
+ return FORMAT_CACHE.get(formatStr);
19
+ }
20
+ // 生成编译后的函数
21
+ const compiledFn = (date, options) => {
22
+ // 获取日期各部分
23
+ const year = date.getFullYear();
24
+ const month = date.getMonth() + 1;
25
+ const day = date.getDate();
26
+ const hours = date.getHours();
27
+ const minutes = date.getMinutes();
28
+ const seconds = date.getSeconds();
29
+ const milliseconds = date.getMilliseconds();
30
+ const weekday = date.getDay();
31
+ const quarter = Math.floor((date.getMonth() + 3) / 3);
32
+ const weekNumber = (0, formatDatePlain_1.getWeekNumber)(date);
33
+ // 12小时制
34
+ const hours12 = hours % 12 || 12;
35
+ const ampm = hours < 12 ? 'AM' : 'PM';
36
+ const ampmLower = ampm.toLowerCase();
37
+ let result = formatStr;
38
+ // 优先替换 timestamp,避免被拆解
39
+ if (result.includes('timestamp')) {
40
+ result = result.replace(/timestamp/g, date.getTime().toString());
41
+ }
42
+ // 2. 应用自定义格式化器(优先级最高)
43
+ if (options.customFormatters) {
44
+ Object.entries(options.customFormatters).forEach(([token, formatter]) => {
45
+ const escapedToken = token.replace(/[.*+?^${}()|[\\]/g, '\\$&');
46
+ const regex = new RegExp(`(?<![a-zA-Z0-9])${escapedToken}(?![a-zA-Z0-9])`, 'g');
47
+ result = result.replace(regex, formatter(date));
48
+ });
49
+ }
50
+ // 3. 替换多字符标记(2-4个字符)
51
+ const multiCharReplacements = {
52
+ YYYY: year.toString().padStart(4, '0'),
53
+ YY: year.toString().slice(-2),
54
+ MM: month.toString().padStart(2, '0'),
55
+ DD: day.toString().padStart(2, '0'),
56
+ HH: hours.toString().padStart(2, '0'),
57
+ hh: hours12.toString().padStart(2, '0'),
58
+ mm: minutes.toString().padStart(2, '0'),
59
+ ss: seconds.toString().padStart(2, '0'),
60
+ SSS: milliseconds.toString().padStart(3, '0'),
61
+ WW: weekNumber.toString().padStart(2, '0'),
62
+ dd: (0, formatDatePlain_1.getLocalizedWeekday)(weekday, options),
63
+ };
64
+ Object.entries(multiCharReplacements).forEach(([token, value]) => {
65
+ // 使用单词边界或字符串边界来确保精确匹配
66
+ const regex = new RegExp(`\\b${token}\\b|${token}(?![a-zA-Z0-9])`, 'g');
67
+ result = result.replace(regex, value);
68
+ });
69
+ // 4. 替换单字符标记(使用更精确的匹配)
70
+ const singleCharReplacements = {
71
+ Y: year.toString(),
72
+ M: month.toString(),
73
+ D: day.toString(),
74
+ H: hours.toString(),
75
+ h: hours12.toString(),
76
+ m: minutes.toString(),
77
+ s: seconds.toString(),
78
+ W: weekNumber.toString(),
79
+ d: weekday.toString(),
80
+ Q: quarter.toString(),
81
+ A: ampm,
82
+ a: ampmLower,
83
+ };
84
+ Object.entries(singleCharReplacements).forEach(([token, value]) => {
85
+ // 单字符需要更精确的匹配:前面是边界或特定字符,后面不是相同字符
86
+ const regex = new RegExp(`(?<![a-zA-Z0-9])${token}(?![a-zA-Z0-9])`, 'g');
87
+ result = result.replace(regex, value);
88
+ });
89
+ return result;
90
+ };
91
+ // 缓存编译结果
92
+ FORMAT_CACHE.set(formatStr, compiledFn);
93
+ return compiledFn;
94
+ }
95
+ exports.compileFormat = compileFormat;
96
+ /**
97
+ * 清除格式化缓存
98
+ * @param formatStr - 可选,指定要清除的格式化字符串缓存
99
+ */
100
+ function clearFormatCache(formatStr) {
101
+ if (formatStr) {
102
+ FORMAT_CACHE.delete(formatStr);
103
+ }
104
+ else {
105
+ FORMAT_CACHE.clear();
106
+ }
107
+ }
108
+ exports.clearFormatCache = clearFormatCache;
109
+ /**
110
+ * 编译模式日期格式化
111
+ * @param input - 要格式化的日期输入
112
+ * @param formatStr - 格式化字符串
113
+ * @param options - 格式化选项
114
+ * @returns 格式化后的日期字符串
115
+ */
116
+ function formatDateCompiled(input, formatStr = 'YYYY-MM-DD HH:mm:ss', options = {}) {
117
+ const date = (0, formatDatePlain_1.safeParseDate)(input);
118
+ const mergedOptions = { ...constants_1.DEFAULT_DATE_FORMAT_OPTIONS, ...options };
119
+ // 编译并缓存格式化函数
120
+ const formatter = compileFormat(formatStr);
121
+ // 使用编译后的函数格式化日期
122
+ return formatter(date, mergedOptions);
123
+ }
124
+ exports.formatDateCompiled = formatDateCompiled;
125
+ exports.default = formatDateCompiled;
126
+ //# sourceMappingURL=formatDateCompiled.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatDateCompiled.js","sourceRoot":"","sources":["../../src/date/formatDateCompiled.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * 普通模式日期格式化实现
3
+ * 每次调用都会重新解析格式化字符串
4
+ */
5
+ import { DateFormatOptions, DateInput } from '../types/date';
6
+ /**
7
+ * 将各种输入类型安全地转换为 Date 对象
8
+ * @param input - 日期输入
9
+ * @returns 转换后的 Date 对象,无效输入返回当前时间
10
+ */
11
+ export declare function safeParseDate(input: DateInput): Date;
12
+ /**
13
+ * 计算一年中的第几周 (ISO 8601)
14
+ * @param date - 日期对象
15
+ * @returns 周数
16
+ */
17
+ export declare function getWeekNumber(date: Date): number;
18
+ /**
19
+ * 获取本地化的星期几
20
+ * @param weekday - 星期几 (0-6)
21
+ * @param options - 格式化选项
22
+ * @returns 本地化的星期几字符串
23
+ */
24
+ export declare function getLocalizedWeekday(weekday: number, options: DateFormatOptions): string;
25
+ /**
26
+ * 普通模式日期格式化
27
+ * @param input - 要格式化的日期输入
28
+ * @param formatStr - 格式化字符串
29
+ * @param options - 格式化选项
30
+ * @returns 格式化后的日期字符串
31
+ */
32
+ export declare function formatDatePlain(input: DateInput, formatStr?: string, options?: Partial<DateFormatOptions>): string;
33
+ export default formatDatePlain;
34
+ //# sourceMappingURL=formatDatePlain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatDatePlain.d.ts","sourceRoot":"","sources":["../../src/date/formatDatePlain.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG7D;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAepD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAMhD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAGvF;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC3B,KAAK,EAAE,SAAS,EAChB,SAAS,GAAE,MAA8B,EACzC,OAAO,GAAE,OAAO,CAAC,iBAAiB,CAAM,GACzC,MAAM,CA+ER;AAED,eAAe,eAAe,CAAC"}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatDatePlain = exports.getLocalizedWeekday = exports.getWeekNumber = exports.safeParseDate = void 0;
4
+ const constants_1 = require("../utils/constants");
5
+ /**
6
+ * 将各种输入类型安全地转换为 Date 对象
7
+ * @param input - 日期输入
8
+ * @returns 转换后的 Date 对象,无效输入返回当前时间
9
+ */
10
+ function safeParseDate(input) {
11
+ if (input instanceof Date && !isNaN(input.getTime())) {
12
+ return input;
13
+ }
14
+ if (typeof input === 'string' || typeof input === 'number') {
15
+ const date = new Date(input);
16
+ if (!isNaN(date.getTime())) {
17
+ return date;
18
+ }
19
+ }
20
+ // 无效输入返回当前时间
21
+ console.warn(`Invalid date input: ${input}, using current date instead.`);
22
+ return new Date();
23
+ }
24
+ exports.safeParseDate = safeParseDate;
25
+ /**
26
+ * 计算一年中的第几周 (ISO 8601)
27
+ * @param date - 日期对象
28
+ * @returns 周数
29
+ */
30
+ function getWeekNumber(date) {
31
+ const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
32
+ const dayNum = d.getUTCDay() || 7;
33
+ d.setUTCDate(d.getUTCDate() + 4 - dayNum);
34
+ const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));
35
+ return Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);
36
+ }
37
+ exports.getWeekNumber = getWeekNumber;
38
+ /**
39
+ * 获取本地化的星期几
40
+ * @param weekday - 星期几 (0-6)
41
+ * @param options - 格式化选项
42
+ * @returns 本地化的星期几字符串
43
+ */
44
+ function getLocalizedWeekday(weekday, options) {
45
+ const lang = options.locale?.split('-')[0] || 'zh';
46
+ return constants_1.WEEKDAY_MAP[lang]?.[weekday] || constants_1.WEEKDAY_MAP.zh[weekday];
47
+ }
48
+ exports.getLocalizedWeekday = getLocalizedWeekday;
49
+ /**
50
+ * 普通模式日期格式化
51
+ * @param input - 要格式化的日期输入
52
+ * @param formatStr - 格式化字符串
53
+ * @param options - 格式化选项
54
+ * @returns 格式化后的日期字符串
55
+ */
56
+ function formatDatePlain(input, formatStr = 'YYYY-MM-DD HH:mm:ss', options = {}) {
57
+ const date = safeParseDate(input);
58
+ const mergedOptions = { ...constants_1.DEFAULT_DATE_FORMAT_OPTIONS, ...options };
59
+ // 获取日期各部分
60
+ const year = date.getFullYear();
61
+ const month = date.getMonth() + 1;
62
+ const day = date.getDate();
63
+ const hours = date.getHours();
64
+ const minutes = date.getMinutes();
65
+ const seconds = date.getSeconds();
66
+ const milliseconds = date.getMilliseconds();
67
+ const weekday = date.getDay();
68
+ const quarter = Math.floor((date.getMonth() + 3) / 3);
69
+ const weekNumber = getWeekNumber(date);
70
+ // 12小时制
71
+ const hours12 = hours % 12 || 12;
72
+ const ampm = hours < 12 ? 'AM' : 'PM';
73
+ const ampmLower = ampm.toLowerCase();
74
+ let result = formatStr;
75
+ // 优先替换 timestamp,避免被拆解
76
+ if (result.includes('timestamp')) {
77
+ result = result.replace(/timestamp/g, date.getTime().toString());
78
+ }
79
+ // 2. 应用自定义格式化器(优先级最高)
80
+ if (mergedOptions.customFormatters) {
81
+ Object.entries(mergedOptions.customFormatters).forEach(([token, formatter]) => {
82
+ const escapedToken = token.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
83
+ const regex = new RegExp(`(?<![a-zA-Z0-9])${escapedToken}(?![a-zA-Z0-9])`, 'g');
84
+ result = result.replace(regex, formatter(date));
85
+ });
86
+ }
87
+ // 3. 替换多字符标记(2-4个字符)
88
+ const multiCharReplacements = {
89
+ YYYY: year.toString().padStart(4, '0'),
90
+ YY: year.toString().slice(-2),
91
+ MM: month.toString().padStart(2, '0'),
92
+ DD: day.toString().padStart(2, '0'),
93
+ HH: hours.toString().padStart(2, '0'),
94
+ hh: hours12.toString().padStart(2, '0'),
95
+ mm: minutes.toString().padStart(2, '0'),
96
+ ss: seconds.toString().padStart(2, '0'),
97
+ SSS: milliseconds.toString().padStart(3, '0'),
98
+ WW: weekNumber.toString().padStart(2, '0'),
99
+ dd: getLocalizedWeekday(weekday, mergedOptions),
100
+ };
101
+ Object.entries(multiCharReplacements).forEach(([token, value]) => {
102
+ const regex = new RegExp(`\\b${token}\\b|${token}(?![a-zA-Z0-9])`, 'g');
103
+ result = result.replace(regex, value);
104
+ });
105
+ // 4. 替换单字符标记(使用更精确的匹配)
106
+ const singleCharReplacements = {
107
+ Y: year.toString(),
108
+ M: month.toString(),
109
+ D: day.toString(),
110
+ H: hours.toString(),
111
+ h: hours12.toString(),
112
+ m: minutes.toString(),
113
+ s: seconds.toString(),
114
+ W: weekNumber.toString(),
115
+ d: weekday.toString(),
116
+ Q: quarter.toString(),
117
+ A: ampm,
118
+ a: ampmLower,
119
+ };
120
+ Object.entries(singleCharReplacements).forEach(([token, value]) => {
121
+ const regex = new RegExp(`(?<![a-zA-Z0-9])${token}(?![a-zA-Z0-9])`, 'g');
122
+ result = result.replace(regex, value);
123
+ });
124
+ return result;
125
+ }
126
+ exports.formatDatePlain = formatDatePlain;
127
+ exports.default = formatDatePlain;
128
+ //# sourceMappingURL=formatDatePlain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatDatePlain.js","sourceRoot":"","sources":["../../src/date/formatDatePlain.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -3,13 +3,13 @@
3
3
  *
4
4
  * @module @planarcat/js-toolkit
5
5
  */
6
- export { default as formatDate } from "./date/formatDate";
7
- export type { DateFormatOptions, DateInput } from "./types/date";
8
- export { default as debounce } from "./function/debounce";
9
- export type { DebounceOptions, DebouncedFunction } from "./types/function";
6
+ export { default as formatDate } from './date/formatDate';
7
+ export type { DateFormatOptions, DateInput } from './types/date';
8
+ export { default as debounce } from './function/debounce';
9
+ 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
- export { default as toFormattedNumber } from "./object/toFormattedNumber";
13
- export { default as toFormattedNumberString } from "./object/toFormattedNumberString";
14
- export type { ToFormattedNumberOptions, ToFormattedNumberStringOptions, } from "./types/object";
12
+ export { default as toFormattedNumber } from './object/toFormattedNumber';
13
+ export { default as toFormattedNumberString } from './object/toFormattedNumberString';
14
+ export type { ToFormattedNumberOptions, ToFormattedNumberStringOptions } from './types/object';
15
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,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AACtF,YAAY,EACV,wBAAwB,EACxB,8BAA8B,GAC/B,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,EAAE,wBAAwB,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -16,8 +16,8 @@ Object.defineProperty(exports, "formatDate", { enumerable: true, get: function (
16
16
  var debounce_1 = require("./function/debounce");
17
17
  Object.defineProperty(exports, "debounce", { enumerable: true, get: function () { return __importDefault(debounce_1).default; } });
18
18
  // 工具库元数据
19
- exports.VERSION = "__VERSION__"; // 构建时替换
20
- exports.LIBRARY_NAME = "@planarcat/js-toolkit";
19
+ exports.VERSION = '__VERSION__'; // 构建时替换
20
+ 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; } });
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;AACrC,4EAAsF;AAA7E,mJAAA,OAAO,OAA2B;AAM3C,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;AAG3C,aAAa;AACb,2DAA2D"}
@@ -1 +1 @@
1
- {"version":3,"file":"toFormattedNumberString.d.ts","sourceRoot":"","sources":["../../src/object/toFormattedNumberString.ts"],"names":[],"mappings":"AA8DA,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,CAAC;AAiI9H,eAAe,uBAAuB,CAAC"}
1
+ {"version":3,"file":"toFormattedNumberString.d.ts","sourceRoot":"","sources":["../../src/object/toFormattedNumberString.ts"],"names":[],"mappings":"AAsNA,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,CAAC;AAkB9H,eAAe,uBAAuB,CAAC"}
@@ -63,121 +63,135 @@ Object.defineProperty(exports, "__esModule", { value: true });
63
63
  * ```
64
64
  */
65
65
  const toFormattedNumber_1 = __importDefault(require("./toFormattedNumber"));
66
- // 主函数实现
67
- function toFormattedNumberString(object, options) {
68
- // 解构并设置默认值
69
- const { decimalPlaces = true, nanValue = 'NaN', zeroValue = '0', localized, preProcessor, prefix = '', suffix = '' } = options || {};
70
- /**
71
- * 添加前缀和后缀
72
- * @param prefix - 前缀
73
- * @param suffix - 后缀
74
- * @param formatted - 格式化后的字符串
75
- * @param converted - 转化后的数字
76
- * @param original - 原始对象
77
- * @returns 添加了前缀后缀的字符串
78
- */
79
- const addPrefixSuffix = (prefix, suffix, formatted, converted, original) => {
80
- let processedPrefix;
81
- if (typeof prefix === 'function') {
82
- processedPrefix = prefix(original, converted, formatted);
83
- }
84
- else {
85
- processedPrefix = prefix;
86
- }
87
- let processedSuffix;
88
- if (typeof suffix === 'function') {
89
- processedSuffix = suffix(original, converted, formatted);
66
+ /**
67
+ * 检查字符串是否包含数字
68
+ * @param str - 要检查的字符串
69
+ * @returns 是否包含数字
70
+ */
71
+ function hasNumbers(str) {
72
+ return /\d/.test(str);
73
+ }
74
+ /**
75
+ * 添加前缀和后缀
76
+ * @param prefix - 前缀
77
+ * @param suffix - 后缀
78
+ * @param formatted - 格式化后的字符串
79
+ * @param converted - 转化后的数字
80
+ * @param original - 原始对象
81
+ * @returns 添加了前缀后缀的字符串
82
+ */
83
+ function addPrefixSuffix(prefix, suffix, formatted, converted, original) {
84
+ let processedPrefix;
85
+ if (typeof prefix === 'function') {
86
+ processedPrefix = prefix(original, converted, formatted);
87
+ }
88
+ else {
89
+ processedPrefix = prefix;
90
+ }
91
+ let processedSuffix;
92
+ if (typeof suffix === 'function') {
93
+ processedSuffix = suffix(original, converted, formatted);
94
+ }
95
+ else {
96
+ processedSuffix = suffix;
97
+ }
98
+ return `${processedPrefix}${formatted}${processedSuffix}`;
99
+ }
100
+ /**
101
+ * 将单个数字转换为格式化字符串
102
+ * @param converted - 原始对象转化为数字后的结果
103
+ * @param original - 原始对象
104
+ * @param options - 格式化选项
105
+ * @returns 格式化后的字符串
106
+ */
107
+ function format(converted, original, options) {
108
+ const { decimalPlaces, zeroValue, localized, preProcessor, prefix, suffix } = options;
109
+ // 处理0情况
110
+ if (converted === 0) {
111
+ return addPrefixSuffix(prefix, suffix, zeroValue, converted, original);
112
+ }
113
+ // 应用预处理函数
114
+ const preProcessed = preProcessor ? preProcessor(original, converted) : converted;
115
+ // 格式化数字为字符串
116
+ let formatted;
117
+ if (localized) {
118
+ // 使用本地化格式
119
+ if (decimalPlaces === true) {
120
+ // 保留所有小数位
121
+ formatted = preProcessed.toLocaleString();
90
122
  }
91
123
  else {
92
- processedSuffix = suffix;
93
- }
94
- return `${processedPrefix}${formatted}${processedSuffix}`;
95
- };
96
- /**
97
- * 将单个数字转换为格式化字符串
98
- * @param converted - 转化后的数字
99
- * @param original - 原始对象
100
- * @returns 格式化后的字符串
101
- */
102
- const convertNumberToString = (converted, original) => {
103
- // 处理0情况
104
- if (converted === 0) {
105
- return addPrefixSuffix(prefix, suffix, zeroValue, converted, original);
124
+ // 保留指定小数位,不够时补0
125
+ formatted = preProcessed.toLocaleString(undefined, {
126
+ minimumFractionDigits: decimalPlaces,
127
+ maximumFractionDigits: decimalPlaces,
128
+ });
106
129
  }
107
- // 应用预处理函数
108
- const processedNum = preProcessor ? preProcessor(original, converted) : converted;
109
- // 格式化数字为字符串
110
- let strNum;
111
- if (localized) {
112
- // 使用本地化格式
113
- if (decimalPlaces === true) {
114
- // 保留所有小数位
115
- strNum = processedNum.toLocaleString();
116
- }
117
- else {
118
- // 保留指定小数位,不够时补0
119
- strNum = processedNum.toLocaleString(undefined, {
120
- minimumFractionDigits: decimalPlaces,
121
- maximumFractionDigits: decimalPlaces,
122
- });
123
- }
130
+ }
131
+ else {
132
+ // 使用非本地化格式
133
+ if (decimalPlaces === true) {
134
+ // 保留所有小数位
135
+ formatted = preProcessed.toString();
124
136
  }
125
137
  else {
126
- // 使用非本地化格式
127
- if (decimalPlaces === true) {
128
- // 保留所有小数位
129
- strNum = processedNum.toString();
130
- }
131
- else {
132
- // 保留指定小数位,不够时补0
133
- strNum = processedNum.toFixed(decimalPlaces);
134
- }
138
+ // 保留指定小数位,不够时补0
139
+ formatted = preProcessed.toFixed(decimalPlaces);
135
140
  }
136
- // 添加前缀和后缀
137
- return addPrefixSuffix(prefix, suffix, strNum, converted, original);
138
- };
139
- /**
140
- * 检查字符串是否包含数字
141
- * @param str - 要检查的字符串
142
- * @returns 是否包含数字
143
- */
144
- const hasNumbers = (str) => {
145
- return /\d/.test(str);
146
- };
147
- /**
148
- * 递归处理值,转换为格式化字符串
149
- * @param value - 要处理的值
150
- * @param original - 原始对象或数组元素
151
- * @returns 格式化后的字符串或字符串数组
152
- */
153
- const processValue = (value, original = object) => {
154
- if (Array.isArray(value)) {
155
- // 递归处理数组
156
- return value.map((item, _index) => processValue(item, item));
141
+ }
142
+ // 添加前缀和后缀
143
+ return addPrefixSuffix(prefix, suffix, formatted, converted, original);
144
+ }
145
+ /**
146
+ * 递归处理值,转换为格式化字符串
147
+ * @param value - 要处理的值
148
+ * @param original - 原始对象或数组元素
149
+ * @param options - 格式化选项
150
+ * @returns 格式化后的字符串或字符串数组
151
+ */
152
+ function processValue(value, original, options) {
153
+ const { decimalPlaces, zeroValue, nanValue, prefix, suffix } = options;
154
+ if (Array.isArray(value)) {
155
+ // 递归处理数组
156
+ return value.map((item, _index) => processValue(item, item, options));
157
+ }
158
+ else {
159
+ // 检查是否为无数字的字符串
160
+ if (typeof value === 'string' && !hasNumbers(value)) {
161
+ // 无数字的字符串返回0
162
+ return addPrefixSuffix(prefix, suffix, zeroValue, 0, original);
157
163
  }
158
- else {
159
- // 检查是否为无数字的字符串
160
- if (typeof value === 'string' && !hasNumbers(value)) {
161
- // 无数字的字符串返回0
162
- return addPrefixSuffix(prefix, suffix, zeroValue, 0, original);
163
- }
164
- // 对于其他类型,首先将输入转换为数字
165
- // 注意:toFormattedNumber对于单个值会返回number类型
166
- const num = (0, toFormattedNumber_1.default)(value, {
164
+ // 对于其他类型,首先将输入转换为数字
165
+ // 注意:toFormattedNumber对于单个值会返回number类型
166
+ const converted = typeof value === 'number'
167
+ ? value
168
+ : (0, toFormattedNumber_1.default)(value, {
167
169
  decimalPlaces,
168
170
  nanValue: NaN,
169
171
  });
170
- // 检查是否为NaN
171
- if (isNaN(num)) {
172
- // 其他NaN情况,使用nanValue
173
- return addPrefixSuffix(prefix, suffix, nanValue, num, original);
174
- }
175
- // 正常数字转换
176
- return convertNumberToString(num, original);
172
+ // 检查是否为NaN
173
+ if (isNaN(converted)) {
174
+ // 其他NaN情况,使用nanValue
175
+ return addPrefixSuffix(prefix, suffix, nanValue, converted, original);
177
176
  }
178
- };
177
+ // 正常数字转换
178
+ return format(converted, original, options);
179
+ }
180
+ }
181
+ // 主函数实现
182
+ function toFormattedNumberString(object, options) {
183
+ // 解构并设置默认值
184
+ const { decimalPlaces = true, nanValue = 'NaN', zeroValue = '0', localized, preProcessor, prefix = '', suffix = '' } = options || {};
179
185
  // 处理输入值
180
- return processValue(object);
186
+ return processValue(object, object, {
187
+ decimalPlaces,
188
+ zeroValue,
189
+ nanValue,
190
+ localized,
191
+ preProcessor,
192
+ prefix,
193
+ suffix,
194
+ });
181
195
  }
182
196
  exports.default = toFormattedNumberString;
183
197
  //# sourceMappingURL=toFormattedNumberString.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"toFormattedNumberString.js","sourceRoot":"","sources":["../../src/object/toFormattedNumberString.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"toFormattedNumberString.js","sourceRoot":"","sources":["../../src/object/toFormattedNumberString.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ export interface DateFormatOptions {
6
6
  * 时区设置
7
7
  * @default 'local'
8
8
  */
9
- timeZone?: "local" | "utc";
9
+ timeZone?: 'local' | 'utc';
10
10
  /**
11
11
  * 语言环境
12
12
  * @default 'zh-CN'
@@ -20,7 +20,7 @@ export interface DateFormatOptions {
20
20
  /**
21
21
  * 支持的格式化标记
22
22
  */
23
- export type DateFormatToken = "YYYY" | "YY" | "MM" | "M" | "DD" | "D" | "HH" | "H" | "hh" | "h" | "mm" | "m" | "ss" | "s" | "SSS" | "A" | "a" | "d" | "dd" | "WW" | "W" | "Q" | "timestamp";
23
+ export type DateFormatToken = 'YYYY' | 'YY' | 'MMMM' | 'MMM' | 'MM' | 'M' | 'DDD' | 'DD' | 'D' | 'Do' | 'HH' | 'H' | 'hh' | 'h' | 'mm' | 'm' | 'ss' | 's' | 'SSS' | 'S' | 'A' | 'a' | 'dddd' | 'ddd' | 'd' | 'WW' | 'W' | 'Q' | 'X' | 'x' | 'timestamp';
24
24
  /**
25
25
  * 可接受的日期输入类型
26
26
  */
@@ -1 +1 @@
1
- {"version":3,"file":"date.d.ts","sourceRoot":"","sources":["../../src/types/date.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IAE3B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC;CAC3D;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GACvB,MAAM,GACN,IAAI,GACJ,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,GAAG,GACH,KAAK,GACL,GAAG,GACH,GAAG,GACH,GAAG,GACH,IAAI,GACJ,IAAI,GACJ,GAAG,GACH,GAAG,GACH,WAAW,CAAC;AAEhB;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC"}
1
+ {"version":3,"file":"date.d.ts","sourceRoot":"","sources":["../../src/types/date.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAC9B;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IAE3B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC;CAC7D;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GACrB,MAAM,GACN,IAAI,GACJ,MAAM,GACN,KAAK,GACL,IAAI,GACJ,GAAG,GACH,KAAK,GACL,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,GAAG,GACH,KAAK,GACL,GAAG,GACH,GAAG,GACH,GAAG,GACH,MAAM,GACN,KAAK,GACL,GAAG,GACH,IAAI,GACJ,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,WAAW,CAAC;AAElB;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@planarcat/js-toolkit",
3
- "version": "1.5.5",
3
+ "version": "1.6.0",
4
4
  "description": "一个自用的带学习性质的(目前)现代化的 JavaScript/TypeScript 实用工具库,提供类型安全、高性能的常用函数,包括对象转换、日期处理、函数优化等开发常用工具。",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",