1

我有一个通过 ajax 读取数字的应用程序,该数字是十六进制的,我对其进行解析并转换为十进制。

这些数字是通过无线串行链路输入的,并不是 100% 可靠的,所以我需要在开始处理数据之前检查它们。以数字****025781610403e5****为例。这****只是检查我过去在非基于 Web 的项目中使用的数字的开始和结束的一种方式,并且可以更改。

无论如何,最后我的问题是:作为错误检查的一部分,我想我会检查 NaN,因为我在测试时确实遇到了 NaN 错误,但是虽然*1234给出了肯定的 NaN12**34却没有,为什么会这样?我还能做些什么来测试?

这是我使用的一些代码,请注意我对javascript相当陌生。

function readSliceConvert()
{
    functionReadForm()
    testVal = hexString.slice(4,18);
    document.getElementById("battDb4").innerHTML=testVal;
    testNum1 = h2d(testVal)
    document.getElementById("battDb5").innerHTML=testNum1.toString();
    testNum2 = parseInt(testVal);
    document.getElementById("battDb6").innerHTML=testNum2.toString();
    if (isNaN(testNum2))
    {
        errorCount++;
        document.getElementById("battDb3").innerHTML=errorCount.toString();
        document.getElementById("battDb4").innerHTML=testVal;

        return;
    }
}
4

3 回答 3

3

那是因为您正在使用parseInt,当它可以解析的字符串开头有一些数字时,它会默默地忽略字符串末尾的字符。

我不知道您的h2d函数在做什么,但似乎您正在将十六进制字符串转换为数字,然后转换为十进制形式的字符串,然后再转换回数字。我看不出解析十六进制字符串的输出不能是数字的任何原因。

例如像这样,如果解析失败则返回 null:

function h2i(str) {
  var num = 0;
  var digits = "0123456789abcdef";
  str = str.toLowerCase();
  for (var i = 0; i < str.length; i++) {
    var n = digits.indexOf(str.substr(i, 1));
    if (n == -1) return null;
    num = num * 16 + n;
  }
  return num;
}

演示:http: //jsfiddle.net/Guffa/6yAaP/

用法:

testVal = hexString.slice(4,18);
document.getElementById("battDb4").innerHTML = testVal;
testNum = h2i(testVal)
document.getElementById("battDb5").innerHTML = testNum.toString();
if (testNum == null)
{
  errorCount++;
  document.getElementById("battDb3").innerHTML = errorCount.toString();
  document.getElementById("battDb4").innerHTML = testVal;
  return;
}
于 2012-11-15T20:47:50.717 回答
0

您会看到奇怪的行为,因为isNan 已损坏(有关详细信息,请参阅 mozilla 文档)。

测试数据格式是否正确的更好方法是使用快速正则表达式,例如serial.test(/^\d+$/),如果整个序列完全是数字,serial.test(/^\*{4}\d+\*{4}$/)它将成功,或者如果序列是四个星号,后跟一个或多个数字,然后是另外四个星号。

更新:@Guffa 的答案是正确的,应该被接受,但我将把它留在这里,因为我认为从大局来看有一个有效的论点,你可以更好地完成你想要用正则表达式做的事情。

对字符串运行test会执行提供的正则表达式,true如果它与字符串匹配则返回。

正则表达式只是描述文本的模式,它可以非常复杂,也可以像我给出的示例一样简单(\d+意味着匹配一个数字(\d)一次或多次(+),锚点用于开头(^)和结尾($) string 表示我们想要匹配整个字符串,而不仅仅是它的一部分。它们非常有用,所以几乎可以肯定值得花时间学习它们如何工作的基础知识,并随着时间的推移扩展你的知识。有一个关于regular-expressions.info的精彩教程,可让您立即开始。

于 2012-11-15T20:46:40.117 回答
0

你知道 parseInt() 是做什么的吗?

来自MDN

parseInt 是一个顶级函数,不与任何对象关联。

parseInt 函数将其第一个参数转换为字符串,对其进行解析,并返回一个整数或 NaN。如果不是 NaN,则返回值将是第一个参数的十进制整数表示形式,该参数采用指定基数(基数)中的数字。例如,基数 10 表示从十进制数、8 位八进制数、16 位十六进制数等转换。对于大于 10 的基数,字母表中的字母表示大于 9 的数字。例如,对于十六进制数(以 16 为基数),使用 A 到 F。

如果 parseInt 在指定的基数中遇到不是数字的字符,它会忽略它和所有后续字符并返回解析到该点的整数值。parseInt 将数字截断为整数值。允许前导和尾随空格。

在控制台中运行代码

console.log( parseInt("12**34",10) );  

因此,您正在针对一个数字运行 isNaN,因为 parseInt 返回 12。

当您将 * 作为第一个字符时,没有要返回的前导数字。

console.log( parseInt("*1234",10) );  
于 2012-11-15T21:08:40.853 回答