JavaScript内置parseInt的基数参数问题

!本文可能 超过1年没有更新,今后内容也许不会被维护或者支持,部分内容可能具有时效性,涉及技术细节或者软件使用方面,本人不保证相应的兼容和可操作性。

最近做的一个基于JavaScript的Word模板生成脚本时遇到的问题,比如时间格式1997.03.08,要将其转变为1997年3月8日,首先大家肯定能想到split(“.”),即根据点将源字符串分割到数组,然后依次提取相应的数组元素,但是03如何变成3呢,也就是说要去掉前导的0,其实我们可以通过转换为数字这个办法解决这个问题,如果是VBScript,那么就直接调用CInt,JavaScript我也想当然的调用了parseInt,就像下面这样:

1
2
3
4
5
6
var src_time = "1997.03.08";
var arr_time = src_time.split(".");
var year = parseInt(arr_time[0]); // 1997
var month = parseInt(arr_time[1]); // 3
var day = parseInt(arr_time[2]); // Uuh, 0?
alert(year + "年" + month + "月" + day + "日");

我们希望输出什么?1997年3月8日?错了,实际输出却是1997年3月0日,为什么是0日,到底做错了什么,我仔细翻阅了parseInt的用法:

parseInt 方法
返回由字符串转换得到的整数。
parseInt(numString, [radix])
参数
numString 必选项。要转换为数字的字符串。
radix
可选项。在 2 和 36 之间的表示 numString 所保存数字的进制的值。如果没有提供,则前缀为 ‘0x’ 的字符串被当作十六进制,前缀为 ‘0’ 的字符串被当作八进制。所有其它字符串都被当作是十进制的。

其实这个函数有个可选项,也就是radix基数参数,默认省略的话,parseInt将自动判别numString的类型,这点与VBScript的CInt有所不同,parseInt功能相比要强大一些,那么问题就很清楚了,也就是说03和08都被当做是8进制处理了,这对8以内的数没有影响,但是对于包括8以及8以上的数,则错误的解释为0了。

这件事情告诫说明,不熟练使用的函数需要翻阅手册,仔细阅读说明后再使用,不能再想当然的使用,否则会有意想不到的后果。修正后的脚本如下(基数为10,表示十进制):

1
2
3
4
5
6
var src_time = "1997.03.08";
var arr_time = src_time.split(".");
var year = parseInt(arr_time[0], 10); // 1997
var month = parseInt(arr_time[1], 10); // 3
var day = parseInt(arr_time[2], 10); // 8
alert(year + "年" + month + "月" + day + "日");

再回到刚才那个问题,有没有更加方便的办法提取这个时间呢,当然是有的,比如说正则表达式,JS在正则方面支持还是比较好的。

1
2
3
4
5
6
7
var src_time = "1997.03.08";
var regstr = /^(\d{4})\.0?(\d{1,2})\.0?(\d{1,2})$/;
var arr_time = src_time.match(regstr);
var year = arr_time[1];
var month = arr_time[2];
var day = arr_time[3];
alert(year + "年" + month + "月" + day + "日");
若无特别说明,本网站文章均为原创,原则上这些文章不允许转载,但是如果阁下是出于研究学习目的可以转载到阁下的个人博客或者主页,转载遵循创作共同性“署名-非商业性使用-相同方式共享”原则,请转载时注明作者出处谢绝商业性、非署名、采集站、垃圾站或者纯粹为了流量的转载。谢谢合作!
请稍后...

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*