重构(后台表单):整数解析收敛到单一内部 helper

- 新增 parseSafeIntegerText 统一十进制校验,四个导出函数改为薄包装
- 注明 parsePositiveIntegerOrZero / parseNonNegativeIntegerOrZero 语义等价
This commit is contained in:
2026-10-04 10:30:29 +08:00
parent 658a39a357
commit 8ad490b39a
+14 -11
View File
@@ -32,26 +32,26 @@ export function formatUnknownJson(value: unknown) {
}
}
/** 严格解析正安全整数:空串、小数、科学计数法、非十进制、非正数与非数字都返回 `null`。 */
export function parsePositiveInteger(value: string): number | null {
/** 内部共用:只接受纯十进制数字串(允许前后空白),拒绝小数、科学计数法与非法 token。 */
function parseSafeIntegerText(value: string): number | null {
const trimmed = value.trim();
// 中文注释:只接受纯十进制数字串,避免 `Number` 把 `1.0` / `1e2` / `0x10` / `+5` 当成整数。
if (!/^\d+$/.test(trimmed)) {
return null;
}
const parsed = Number(trimmed);
return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : null;
return Number.isSafeInteger(parsed) ? parsed : null;
}
/** 严格解析正安全整数:空串、小数、科学计数法、非十进制、非正数与非数字都返回 `null`。 */
export function parsePositiveInteger(value: string): number | null {
const parsed = parseSafeIntegerText(value);
return parsed !== null && parsed > 0 ? parsed : null;
}
/** 严格解析非负安全整数:空串、小数、科学计数法、非十进制、负数与非数字都返回 `null`。 */
export function parseNonNegativeInteger(value: string): number | null {
const trimmed = value.trim();
// 中文注释:只接受纯十进制数字串,避免 `Number` 把 `1.0` / `1e2` / `0x10` / `+5` 当成整数。
if (!/^\d+$/.test(trimmed)) {
return null;
}
const parsed = Number(trimmed);
return Number.isSafeInteger(parsed) && parsed >= 0 ? parsed : null;
return parseSafeIntegerText(value);
}
/** 落库用宽松解析:非法输入按 `0` 处理,避免后台保存被输入抖动打断。 */
@@ -59,7 +59,10 @@ export function parsePositiveIntegerOrZero(value: string): number {
return parsePositiveInteger(value) ?? 0;
}
/** 落库用宽松解析:非法输入按 `0` 处理,避免后台保存被输入抖动打断。 */
/** 落库用宽松解析:非法输入按 `0` 处理,避免后台保存被输入抖动打断。
*
* 与 [`parsePositiveIntegerOrZero`] 行为一致(`0` 与非法输入都落到 `0`),保留独立名字只为让调用点
* 表达业务语义;真正的整数解析统一走 [`parseSafeIntegerText`]。 */
export function parseNonNegativeIntegerOrZero(value: string): number {
return parseNonNegativeInteger(value) ?? 0;
}