想知道当我把头发拉过这个时,是否有人可以解决一些问题!
我已经编写了一个简单的函数来验证用户出生日期是好还是好,或者至少直到我意识到它没有按预期工作!
该函数如下所示,取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;
}
}
答案 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的整数