修正(后台表单):严格整数解析只接受纯十进制数字

- parsePositiveInteger / parseNonNegativeInteger 改用 ^\d+$ 校验原始字符串
- 拒绝 1.0、1e2、0x10、+5 等 Number 会隐式转换的写法,与'严格整数'注释一致
This commit is contained in:
2026-10-04 10:29:55 +08:00
parent dfa92607b4
commit 658a39a357
+10 -6
View File
@@ -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;
}