【问题标题】:isNaN not catching lettersisNaN 没有捕捉到字母
【发布时间】:2015-05-21 20:41:22
【问题描述】:

我有 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)) 在这种情况下允许通过?

【问题讨论】:

  • 旁注:有人说异常应该用于异常的事情,输入验证并不完全是异常的。

标签: javascript string numbers nan


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    String.substring 函数签名是:

    str.substring(indexA[, indexB])
    

    索引A

    一个介于 0 和字符串长度之间的整数,指定 偏移到要包含在 返回子字符串。

    索引B

    可选。一个介于 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
    

    【讨论】:

    • 值得注意的是"12345-678a".substr(6,9) // 678a
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-05
      • 2020-10-19
      相关资源
      最近更新 更多