You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

里程表读数输入校验问题:十进制转十六进制异常排查

问题分析与修复方案

核心问题拆解

  1. 十六进制转换失效:原代码中vODOstart是输入框获取的字符串,直接调用toString(16)不会将其转为数值对应的十六进制,只会返回原字符串,导致转换逻辑完全无效。
  2. 输入校验逻辑错误:原代码把截取的子串当作十进制数值与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 17:45:19