里程表读数输入校验问题:十进制转十六进制异常排查
问题分析与修复方案
核心问题拆解
- 十六进制转换失效:原代码中
vODOstart是输入框获取的字符串,直接调用toString(16)不会将其转为数值对应的十六进制,只会返回原字符串,导致转换逻辑完全无效。 - 输入校验逻辑错误:原代码把截取的子串当作十进制数值与30/39比较,实际需求是校验输入字符的ASCII十六进制值在
0x30到0x39之间(对应十进制48-57,即数字0-9),原逻辑错误限制输入值必须是30-39的数字,而非允许输入任意数字。
修正后的代码
<script language="JavaScript"> function checkFormStartShift() { // 获取输入值并去除前后空格 var vODOstartStr = document.startshift.odostart.value.trim(); // 校验输入是否全为数字 for (var i = 0; i < vODOstartStr.length; i++) { // 获取字符的ASCII码(十进制),0-9对应48-57 var charCode = vODOstartStr.charCodeAt(i); if (charCode < 48 || charCode > 57) { alert("Starting KMs should be numbers only"); return false; } } // 转换为数值并校验范围 var vODOstart = parseInt(vODOstartStr, 10); if (vODOstart <= 0) { alert("Starting ODO cannot be 0 or negative. Please correct."); return false; } // 正确将里程数转为十六进制字符串 var vConvertHex = vODOstart.toString(16); // 可根据需求添加十六进制结果的后续处理 console.log("转换后的十六进制值:", vConvertHex); return true; } </script>
关键修改说明
- 修复十六进制转换:先将输入字符串转为十进制数值,再调用
toString(16)得到正确的十六进制表示。 - 修正输入校验逻辑:通过
charCodeAt(i)获取字符ASCII码,直接校验是否在48-57区间(对应数字0-9),替代原错误的子串数值比较。 - 优化输入处理:增加
trim()去除前后空格,避免空输入或空格引发的错误。 - 调整校验顺序:先校验格式是否合法,再校验数值范围,逻辑更合理。
内容的提问来源于stack exchange,提问作者Cookie87
相关产品推荐
相关产品推荐

