在js中做数字字符串补0(js补零)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在js中做数字字符串补0(js补零)
通常遇到的⼀个问题是⽇期的“1976-02-03 HH:mm:ss”这种格式,我的⽐较简单的处理⽅法是这样:
function formatDate(d) {
var D=['00','01','02','03','04','05','06','07','08','09']
with (d || new Date) 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的⽉影提供了另⼀个⽅案:
function pad(num, n) {
return Array(n>num?(n-(''+num).length+1):0).join(0)+num;
}
调⽤⽰例如下:
pad(100, 4); // 输出:0100
⽉影在这⾥分析了其中的技巧,以及代码长短与效率上的平衡:
最后⽉影推荐的是“质朴长存法”:
/* 质朴长存法 by lifesinger */
function pad(num, n) {
var len = num.toString().length;
while(len < n) {
num = "0" + num;
len++;
}
return num;
}
这个在“没事就射鸟”同学的博客⾥做了分析
⽉影同学有⼀件事是没有做的,就是没说明“为什么那个短代码的效率更低?”。

答案是“表⾯看来,⽤array.join来替代循环是⾼效的,但忘掉了⼀个数组创建的开销”。

对此有没有法⼦呢?我有过另⼀个解决的思路。

如下:
/* 查表法(不完善) by aimingoo */
pad = function(tbl) {
return function(num, n) {
return (((tbl[n = n-num.toString().length]) || (tbl[n] = Array(n).join(0))) + num);
}
}([]);
这个路⼦跟前⾯的formatDate()是⼀样的,只不是formatDate()⾥的表是⼀个确定的数组,⽽这⾥的数组则是动态⽣成,然后缓存在tbl[]⾥⾯。

这个缓存的tbl[]数组是使⽤⼀个函数调⽤参数的形式,保持在最终的pad()函数的上层闭包⾥⾯。

为了让上⾯的这个过程清晰⼀点,我重排代码格式如下:
pad = function(tbl) {
return function(num, n) {
return (
((tbl[n = n-num.toString().length]) ||
(tbl[n] = Array(n).join(0))) +
num
);
}
}([]);
好的。

到这⾥,先别急,还有两个问题要解决。

其⼀,当不需要补0时,上述的tbl[0]返回空值,所以会进⼊到“||”运算的第⼆个分⽀,因此导致Array()重算⼀次,也就是说“不补0的情况效率其实最低”。

其⼆,当num长度⼤于n时,也就变成了“补负数个零”。

“补负数个零”显然不⾏,⼀般对此处理成“不需要补零”,于是⼜回到了第⼀个问题。

这两个问题可以⼀次解决,其实就是多⼀次判断:
/* 查表法(完善版本) by aimingoo */
pad = function(tbl) {
return function(num, n) {
return (0 >= (n = n-num.toString().length)) ? num : (tbl[n] || (tbl[n] = Array(n+1).join(0))) + num;
}
}([]);
当然,也可以象前⾯⼀样整理⼀下这个代码格式。

或者,采⽤⼀个完全不⽤“(函数式语⾔的)连续运算等技巧”的版本:
/* 查表法(过程式版本) by aimingoo */
pad = function() {
var tbl = [];
return function(num, n) {
var len = n-num.toString().length;
if (len <= 0) return num;
if (!tbl[len]) tbl[len] = (new Array(len+1)).join('0');
return tbl[len] + num;
}
}();
算法永远都是如此,要不是时间换空间,要不就是空间换时间。

射雕同学的“质朴长存法”是时间换空间的⽅法,⽽这⾥的查表法则是空间换时间的⽅案。

这个函数会在tbl中持续⼀个字符串数组,如果num是⾮常经常变化的,那么效率也不会有太⼤提升——对于过于频繁变化的系统,缓存就意义不⼤了。

其实逻辑都差不多,⽉影同学只是少⾛了⼀步⽽已。

相关文档
最新文档