diff --git a/apps/admin-web/src/pages/pageUtils.ts b/apps/admin-web/src/pages/pageUtils.ts index d350a39aa..8a85eaceb 100644 --- a/apps/admin-web/src/pages/pageUtils.ts +++ b/apps/admin-web/src/pages/pageUtils.ts @@ -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; }