isNaN 没有捕捉到字母

isNaN not catching letters

我有 JS 代码来验证邮政编码:10 个数字字符,第 6 个位置有破折号(例如,12345-6789)。我使用 !isNaN.

验证这两个部分都是数字
if (valSize == 10) {
    var numVal1 = new Number(newVal.substring(0, 4));
    var numVal2 = new Number(newVal.substring(6, 9));
    if (newVal.charAt(5) == '-' && !isNaN(numVal1) && !isNaN(numVal2)) {
        return newVal;
    }
}
throw "Incorrect format";

这主要是有效的,但由于某些原因,以下值会通过,并且不会返回错误:

12345-678a

为什么 !IsNaN(substring(6,9)) 在这种情况下允许通过?

newVal.substring(6,9) 在字符串“12345-678a”的情况下会 return “678”,这是一个数字。所以应该不会抛出错误。

String.substring 函数签名为:

str.substring(indexA[, indexB])

indexA

An integer between 0 and the length of the string, specifying the offset into the string of the first character to include in the returned substring.

indexB

Optional. An integer between 0 and the length of the string, which specifies the offset into the string of the first character NOT to include in the returned substring.

所以你有:

"12345-678a".substring(0,4) // 1234
"12345-678a".substring(6,9) // 678

所以要么更正索引:

"12345-678a".substring(0,5) // 12345
"12345-678a".substring(6)   // 678a

或使用String.substr.


或使用正则表达式(推荐),因为您当前的代码在修复后很乐意接受 12.45-67.8+1234--67812e45-6e-9。您需要做的就是:

/^\d{5}-\d{4}$/.test("12345-678a") // false
/^\d{5}-\d{4}$/.test("12.45-67.8") // false
/^\d{5}-\d{4}$/.test("12345-6789") // true

正则表达式不是更合适的测试吗?

/\d{5}-\d{4}/.test('12345-1234')
true

/\d{5}-\d{4}/.test('12345-123a')
false