parseInt()返回不正确的值; DOB验证

时间:2010-08-10 07:14:25

标签: javascript

想知道当我把头发拉过这个时,是否有人可以解决一些问题!

我已经编写了一个简单的函数来验证用户出生日期是好还是好,或者至少直到我意识到它没有按预期工作!

该函数如下所示,取2个参数,dobNum(输入字段的值)和dmy(接收'dd','mm'或'yyyy'的开关变量)。该函数使用输入字段的值调用如下,因此不应存在任何基于对象的问题:

onblur =“validateDOB(this.value,'mm');

我花了很多时间试图找到它的底部,并且parseInt()语句似乎存在问题。 这适用于几天和几个月,直到你通过08(零,八)或09(零,九)。这里parseInt()的结果分别返回0而不是8或9 但这只是08和09的一个问题,传递数字01到07会像预期的那样返回1到7 类似地,当将单个数字1到9传递给函数时,parseInt()以整数形式返回适当的值。

真的很难理解这一个。相反,完全删除parseInt语句似乎有效,但这会将dobNum值保留为字符串,我认为这不是特别好的做法。

有人可以对此有所了解吗? (在Firefox和IE中都会出现此问题) 非常感谢, SMC

var DOBddOK = false;
var DOBmmOK = false;
var DOByyyyOK = false;

function validateDOB (dobNum, dmy) {
  // Set Regexp based on dmy var.
    if (dmy.length == 2) var reg = /^([0-9]{1,2})$/;
      else  var reg = /^([0-9]{4})$/;
    var numOK = reg.test(dobNum);
    alert("NumOK: "+numOK); //test

  // If dobNum value passes regExp test then convert  it to an integer
    if (numOK) {
      var numVar = parseInt(dobNum); 
      //var numVar = dobNum;
      alert("NumVar: "+numVar); //test
    }
    alert("dmy: "+dmy); //test

    switch (dmy) {
      case "dd":
        if (numOK && numVar <= 31 && numVar > 0) DOBddOK = true;
        else DOBddOK = false;
        break;
      case "mm":
        if (numOK && numVar <= 12 && numVar > 0) DOBmmOK = true;
        else DOBmmOK = false;
        break;
      case "yyyy":
        var d = new Date();
        d = d.getFullYear();
        if (numOK && numVar <= (d-18) && numVar >= (d-80)) DOByyyyOK = true;
        else DOByyyyOK = false;
        break;
    }
}

3 个答案:

答案 0 :(得分:12)

parseInt函数在传递的字符串中找到前导零时,它将隐式地将数字解析为八进制。

始终建议使用radix参数:

parseInt('08', 10); // 8
parseInt('09', 10); // 9

这引起了很多问题,因为在新版本的语言标准ECMAScript 5中,隐式八进制检测已从parseInt algorithm中删除。但ES5尚未得到完全支持。

还有其他方法可以在JavaScript中将String转换为Number,但不会出现此问题,例如:

unary plus运营商:

+'08'; // 8

The Number constructor called as a Function

Number('08'); // 8

在我看来parseInt以及我所描述的后两种方式都有(巧妙地)不同的语义

前者显然是解析,例如:

parseInt('12px');    // 12
parseInt('10yo');    // 10
parseInt('1111', 2); // 15

最后两种方法是将String转换为数字类型转换

答案 1 :(得分:2)

它将前导零处理为八进制的字符串,您可以指定第二个参数,将基数设为10。

请参阅link text

答案 2 :(得分:1)

尝试使用基数parseInt(dobNum, 10)来解析基数为10的整数