涉及简单子字符串的非常奇怪的错误

时间:2012-09-10 20:11:03

标签: javascript function substring

我正在尝试创建一个函数,它应该检查某个日期是否格式正确。 对此,函数接受一个变量,并将其分解为三个子变量,年,月和日。稍后我想在几个if语句中检查每个子串。

当我使用我的GFs号码880413然后年份= 88,月份= 4,天= 13运行时 但是,当我用我自己的号码820922运行这个函数时,那么函数将year设置为82,month设置为0 ?!和白天= 22。

这怎么可能?当月份为04时,它会将其切断并仅显示4,但是当月份为09时,它会将其切断为0。

Heres相关代码:

function isValidDate(date) 
{
    var valid = true;

    var year = parseInt(date.substring(0, 2));
    var month = parseInt(date.substring(2, 4)); // error here!
    var day = parseInt(date.substring(4, 6));
    alert(year+"--"+month+"--"+day+"--")
}

运行号码820922时的输出(忘记最后4位数字,它们是瑞典社会安全号码,在此示例中无需考虑)

enter image description here

并且输出号为880413(再次忘记最后4位数) enter image description here

5 个答案:

答案 0 :(得分:7)

使用parseInt()

时始终指定基数

原因是如果你没有指定它,它不会默认为基数10,而是根据第一个数字/字符猜测。 IE如果以'0'开头则将其解释为八进制

function isValidDate(date) 
{
    var valid = true;

    var year = parseInt(date.substring(0, 2), 10);
    var month = parseInt(date.substring(2, 4), 10);
    var day = parseInt(date.substring(4, 6), 10);
    alert(year+"--"+month+"--"+day+"--")
}

或使用Number()

var month = Number(date.substring(2, 4));

答案 1 :(得分:3)

指定base - 使用parseInt(“09”,10)。由于遗留原因,启动一个零的数字将被解析为八进制。 “8”和“9”不是有效的八进制数字,因此“09”无法成功解析为整数。

编辑 - 进行一些挖掘,显然你所做的事情符合官方ECMAscript标准,但大多数实现仍然使用八进制格式 - 详情here

答案 2 :(得分:1)

如果 08 ,您也会看到相同的问题。这是因为Javascript将以0开头的数字视为八进制,并且八进制中没有0908。所以你可以提供基数作为第二个参数:

alert(parseInt('08',10));

答案 3 :(得分:0)

当你用一个整数连接字符串时,它永远不会给你04.要获得你想要的结果,你需要使用printf:

'%02d--%02d--%02d'.sprintf(year, month, day);

函数sprintf来自Prototype库。

答案 4 :(得分:0)

正则表达式可能有所帮助。

date.replace( /(\d{2})(\d{2})(\d{2})/,'$1--$2--$3--');