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

  

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

        函数formatDate (d) {   var D=[“00”、“01”、“02”,“03”,“04”、“05”, 06年’,‘7’,‘08年’,' 09年']   新日期)和(d | |返回(   [getFullYear ()、D (getMonth () + 1] | | getMonth () + 1, D(获取当前日期()]| |获取当前日期()]. join (“-”),   [D [getHours ()] | | getHours ()、D (getMinutes ()] | | getMinutes ()、D (getSeconds ()] | | getSeconds ()] . join (“:”)   ]。加入(' ');   }      

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

        函数垫(num n) {   返回数组(n> num # 63; (n - (“+ num) . length + 1): 0) . join (0) + num;   }      

调用示例如下:

        垫(100 4);//输出:0100      

月影在这里分析了其中的技巧,以及代码长短与效率上的平衡:
  最后月影推荐的是“质朴长存法”:

     /*质朴长存法lifesinger */函数垫(num n) {   var len=num.toString . length ();   尽管(兰& lt;n) {   num=" 0 " + num;   len + +;   }   返回num;   }      

这个在“没事就射鸟”同学的博客里做了分析
  月影同学有一件事是没有做的,就是没说明”为什么那个短代码的效率更低吗?”。
  答案是“表面看来,用array.join来替代循环是高效的,但忘掉了一个数组创建的开销”。对此有没有法子呢?我有过另一个解决的思路。如下:

     /*查表法(不完善)aimingoo */垫=函数(台){   返回函数(num n) {   返回((((资源[n=n-num.toString () . length]) | |(资源描述[n] . join(0))=数组(n)) + num);   }   }([]);      

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

        垫=函数(台){   返回函数(num n) {   回报(   (((资源(n=n-num.toString () . length]) | |   (资源描述[n] . join(0))=数组(n)) +   全国矿工工会   );   }   }([]);      

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

     /*查表法(完善版本)aimingoo */垫=函数(台){   返回函数(num n) {   返回(0祝辞=(n=n-num.toString () . length)) & # 63;num:(台[n] | |(资源描述[n]=数组(n + 1) . join (0))) + num;   }   }([]);      

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

     /*查表法(过程式版本)aimingoo */垫=function () {   var(资源=[];   返回函数(num n) {   var len=n-num.toString . length ();   如果(len & lt;=0)返回num;   如果(!(资源(len])台(len)=(新数组(len + 1)) . join (“0”);   返回资源(len) + num;   }   }();      

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

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