From 8ad490b39a75a416d6c0ba8c1aa2f46d0aeb5d26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Sun, 4 Oct 2026 10:30:29 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84(=E5=90=8E=E5=8F=B0=E8=A1=A8?= =?UTF-8?q?=E5=8D=95)=EF=BC=9A=E6=95=B4=E6=95=B0=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E6=94=B6=E6=95=9B=E5=88=B0=E5=8D=95=E4=B8=80=E5=86=85=E9=83=A8?= =?UTF-8?q?=20helper?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 parseSafeIntegerText 统一十进制校验,四个导出函数改为薄包装 - 注明 parsePositiveIntegerOrZero / parseNonNegativeIntegerOrZero 语义等价 --- apps/admin-web/src/pages/pageUtils.ts | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) 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; }