From 658a39a357a2e97c55861ca358e7549c7617ce94 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:29:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3(=E5=90=8E=E5=8F=B0=E8=A1=A8?= =?UTF-8?q?=E5=8D=95)=EF=BC=9A=E4=B8=A5=E6=A0=BC=E6=95=B4=E6=95=B0?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E5=8F=AA=E6=8E=A5=E5=8F=97=E7=BA=AF=E5=8D=81?= =?UTF-8?q?=E8=BF=9B=E5=88=B6=E6=95=B0=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - parsePositiveInteger / parseNonNegativeInteger 改用 ^\d+$ 校验原始字符串 - 拒绝 1.0、1e2、0x10、+5 等 Number 会隐式转换的写法,与'严格整数'注释一致 --- apps/admin-web/src/pages/pageUtils.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/apps/admin-web/src/pages/pageUtils.ts b/apps/admin-web/src/pages/pageUtils.ts index ed90abdd9..d350a39aa 100644 --- a/apps/admin-web/src/pages/pageUtils.ts +++ b/apps/admin-web/src/pages/pageUtils.ts @@ -32,21 +32,25 @@ export function formatUnknownJson(value: unknown) { } } -/** 严格解析正安全整数:空串、小数、非正数与非数字都返回 `null`,用于表单校验。 */ +/** 严格解析正安全整数:空串、小数、科学计数法、非十进制、非正数与非数字都返回 `null`。 */ export function parsePositiveInteger(value: string): number | null { - if (value.trim() === '') { + const trimmed = value.trim(); + // 中文注释:只接受纯十进制数字串,避免 `Number` 把 `1.0` / `1e2` / `0x10` / `+5` 当成整数。 + if (!/^\d+$/.test(trimmed)) { return null; } - const parsed = Number(value); + const parsed = Number(trimmed); return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : null; } -/** 严格解析非负安全整数:空串、小数、负数与非数字都返回 `null`,用于表单校验。 */ +/** 严格解析非负安全整数:空串、小数、科学计数法、非十进制、负数与非数字都返回 `null`。 */ export function parseNonNegativeInteger(value: string): number | null { - if (value.trim() === '') { + const trimmed = value.trim(); + // 中文注释:只接受纯十进制数字串,避免 `Number` 把 `1.0` / `1e2` / `0x10` / `+5` 当成整数。 + if (!/^\d+$/.test(trimmed)) { return null; } - const parsed = Number(value); + const parsed = Number(trimmed); return Number.isSafeInteger(parsed) && parsed >= 0 ? parsed : null; }