JavaScript数字验证失效:输入1/2等分数未被判定为无效
修复天数输入验证函数,禁止分数格式输入
问题根源
原代码依赖parseFloat()判断输入合法性,但parseFloat("1/2")会仅解析出数字1并忽略后续的/2,导致isNaN(parseFloat("1/2"))返回false,无法识别分数格式为无效输入。
解决方案
使用正则表达式严格校验输入格式,确保输入只能是整数或合法浮点数,同时修复错误计数的递增逻辑(原代码中字符串类型的计数递增存在逻辑错误)。
修正后的代码
JavaScript 验证函数
function VerifyNumDays(Numdays) { // 将错误计数转为整数,默认值为0 var vErrorMsgCount = parseInt(document.getElementById('ErrorMsgCount_ID').value) || 0; // 正则规则:仅允许整数或带小数的数字,禁止分数、特殊字符 const validNumPattern = /^\d+(\.\d+)?$/; // 第一步:校验输入格式是否合法 if (!validNumPattern.test(Numdays.trim())) { if (vErrorMsgCount < 2) { alert("天数必须是有效数字(整数或浮点数,禁止1/2这类分数格式)"); } document.getElementById('SubmitButton_ID').disabled = true; document.getElementById('ErrorMsgCount_ID').value = vErrorMsgCount + 1; return; } // 第二步:校验数值有效性 const numDaysValue = parseFloat(Numdays); if (isNaN(numDaysValue)) { if (vErrorMsgCount < 2) { alert("天数必须是有效数字"); } document.getElementById('SubmitButton_ID').disabled = true; document.getElementById('ErrorMsgCount_ID').value = vErrorMsgCount + 1; return; } if (numDaysValue <= 0) { if (vErrorMsgCount < 2) { alert("天数必须大于0"); } document.getElementById('SubmitButton_ID').disabled = true; document.getElementById('ErrorMsgCount_ID').value = vErrorMsgCount + 1; return; } // 第三步:校验天数是否超出日期范围 const dStart = Date.parseExact(document.getElementById('calfield1').value, "MM/dd/yyyy"); const dEnd = Date.parseExact(document.getElementById('calfield2').value, "MM/dd/yyyy"); if (dStart && dEnd) { const StartCalculated = addDays(dStart, numDaysValue - 1); if (StartCalculated > dEnd) { alert("输入的天数超出了起止日期之间的天数范围"); document.getElementById('SubmitButton_ID').disabled = true; } else { document.getElementById('SubmitButton_ID').disabled = false; } } else { alert("请输入有效的起止日期"); document.getElementById('SubmitButton_ID').disabled = true; } }
关键修改点
- 正则格式校验:通过
/^\d+(\.\d+)?$/直接拦截分数、特殊字符等非法格式,确保输入仅为整数或浮点数。 - 错误计数修复:将从DOM获取的计数转为整数后再递增,避免字符串操作导致的计数失效。
- 日期判断增强:增加对起止日期解析结果的校验,避免因日期格式错误导致的后续逻辑崩溃。
内容的提问来源于stack exchange,提问作者will
相关产品推荐
相关产品推荐

