isNaN没有捕捉字母

时间:2015-03-18 21:04:32

标签: javascript string numbers nan

我有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))传递?

3 个答案:

答案 0 :(得分:7)

String.substring函数签名是:

str.substring(indexA[, indexB])
  

<强>索引A

     

0到字符串长度的整数,指定   偏移到要包含在的第一个字符的字符串中   返回子字符串。

     

<强> indexB

     

可选。一个介于0和字符串长度之间的整数   指定第一个字符 NOT 的字符串的偏移量   包含在返回的子字符串中。

所以你有:

"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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

在字符串“12345-678a”的情况下,

newVal.substring(6,9)将返回“678”,这是一个数字。所以应该抛出错误。