javascript代码实例教程-在js中如何做数字字符串补0?

发布时间:2018-12-22 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了javascript代码实例教程-在js中如何做数字字符串补0?脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
小宝典致力于为广大程序猿(媛)提供高品质的代码服务,请大家多多光顾小站,小宝典在此谢过。

通常遇到的一个问题是日期的“1976-02-03 HH:mm:ss”这种格式 ,我的比较简单的处理方法是这样:

[javascript]view plaincopy

functionformatDate(d){

VARD=['00','01','02','03','04','05','06','07','08','09']

wITh(d||newDate)return[

[getFullYear(),D[getMonth()+1]||getMonth()+1,D[getDate()]||getDate()].join('-'),

[D[getHours()]||getHours(),D[getMinutes()]||getMinutes(),D[getSeconds()]||getSeconds()].join(':')

].join('');

}

这种方法是逻辑比较简单的,而且规则也简单。除了with(d||new Date)的使用之外,也算不上什么技巧。但是,如果用这种方法来做数字字符串补0,那么结果显然不妙。51js的月影提供了另一个方案

[javascript]view plaincopy

functionpad(num,n){

returnArray(n>num?(n-(''+num).length+1):0).join(0)+num;

}

调用示例如下:

[javascript]view plaincopy

pad(100,4);//输出:0100

月影在这里分析了其中的技巧,以及代码长短与效率上的平衡:

https://hi.baidu.COM/akira_cn/blog/item/90ba2a8b07c867dafc1F1045.htML

最后月影推荐的是“质朴长存法”:

[javascript]view plaincopy

/*质朴长存法bylifesinger*/

functionpad(num,n){

varlen=num.toString().length;

while(len num="0"+num;

len++;

}

returnnum;

}

这个在“没事就射鸟”同学的博客里做了分析:

https://lifesinger.org/bLOG/2009/08/the-harm-of-tricky-code/

月影同学有一件事是没有做的,就是没说明“为什么那个短代码的效率更低?”。

答案是“表面看来,用array.join来替代循环是高效的,但忘掉了一个数组创建的开销”。对此有没有法子呢?我有过另一个解决的思路。如下:

[javascript]view plaincopy

/*查表法(不完善)byaimingoo*/

pad=function(tbl){

returnfunction(num,n){

return(((tbl[n=n-num.toString().length])||(tbl[n]=Array(n).join(0)))+num);

}

}([]);

这个路子跟前面的formatDate()是一样的,只不是formatDate()里的表是一个确定的数组,而这里的数组则是动态生成,然后缓存在tbl[]里面。这个缓存的tbl[]数组是使用一个函数调用参数的形式,保持在最终的pad()函数的上层闭包里面。为了让上面的这个过程清晰一点,我重排代码格式如下:

[javascript]view plaincopy

pad=function(tbl){

returnfunction(num,n){

return(

((tbl[n=n-num.toString().length])||

(tbl[n]=Array(n).join(0)))+

num

);

}

}([]);

好的。到这里,先别急,还有两个问题要解决。其一,当不需要补0时,上述的tbl[0]返回空值,所以会进入到“||”运算的第二个分支,因此导致Array()重算一次,也就是说“不补0的情况效率其实最低”。其二,当num长度大于n时,也就变成了“补负数个零”。“补负数个零”显然不行,一般对此处理成“不需要补零”,于是又回到了第一个问题。

这两个问题可以一次解决,其实就是多一次判断:

[javascript]view plaincopy

/*查表法(完善版本)byaimingoo*/

pad=function(tbl){

returnfunction(num,n){

return(0>=(n=n-num.toString().length))?num:(tbl[n]||(tbl[n]=Array(n+1).join(0)))+num;

}

}([]);

当然,也可以象前面一样整理一下这个代码格式。或者,采用一个完全不用“(函数式语言的)连续运算等技巧”的版本:

[javascript]view plaincopy

/*查表法(过程式版本)byaimingoo*/

pad=function(){

vartbl=[];

returnfunction(num,n){

varlen=n-num.toString().length;

if(len<=0)returnnum;

if(!tbl[len])tbl[len]=(newArray(len+1)).join('0');

returntbl[len]+num;

}

}();

算法永远都是如此,要不是时间换空间,要不就是空间换时间。射雕同学的“质朴长存法”是时间换空间的方法,而这里的查表法则是空间换时间的方案。这个函数会在tbl中持续一个字符串数组,如果num是非常经常变化的,那么效率也不会有太大提升——对于过于频繁变化的系统,缓存就意义不大了。其实逻辑都差不多,月影同学只是少走了一步而已。

觉得可用,就经常来吧! 脚本宝典 欢迎评论哦!&nbsp;js脚本,巧夺天工,精雕玉琢。小宝典献丑了!

脚本宝典总结

以上是脚本宝典为你收集整理的javascript代码实例教程-在js中如何做数字字符串补0?全部内容,希望文章能够帮你解决javascript代码实例教程-在js中如何做数字字符串补0?所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。