在js中做数字字符串补0

转自(http://blog.csdn.net/aimingoo/article/details/4492592)

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

[javascript] view plaincopy

  1. function formatDate(d) {
  2. var D=[‘00‘,‘01‘,‘02‘,‘03‘,‘04‘,‘05‘,‘06‘,‘07‘,‘08‘,‘09‘]
  3. with (d || new Date) return [
  4. [getFullYear(), D[getMonth()+1]||getMonth()+1, D[getDate()]||getDate()].join(‘-‘),
  5. [D[getHours()]||getHours(), D[getMinutes()]||getMinutes(), D[getSeconds()]||getSeconds()].join(‘:‘)
  6. ].join(‘ ‘);
  7. }

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

[javascript] view plaincopy

  1. function pad(num, n) {
  2. return Array(n>num?(n-(‘‘+num).length+1):0).join(0)+num;
  3. }

调用示例如下:

[javascript] view plaincopy

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

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

http://hi.baidu.com/akira_cn/blog/item/90ba2a8b07c867dafc1f1045.html

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

[javascript] view plaincopy

  1. /* 质朴长存法  by lifesinger */
  2. function pad(num, n) {
  3. var len = num.toString().length;
  4. while(len < n) {
  5. num = "0" + num;
  6. len++;
  7. }
  8. return num;
  9. }

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

http://lifesinger.org/blog/2009/08/the-harm-of-tricky-code/

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

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

[javascript] view plaincopy

  1. /* 查表法(不完善)  by aimingoo */
  2. pad = function(tbl) {
  3. return function(num, n) {
  4. return (((tbl[n = n-num.toString().length]) || (tbl[n] = Array(n).join(0))) + num);
  5. }
  6. }([]);

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

[javascript] view plaincopy

  1. pad = function(tbl) {
  2. return function(num, n) {
  3. return (
  4. ((tbl[n = n-num.toString().length]) ||
  5. (tbl[n] = Array(n).join(0))) +
  6. num
  7. );
  8. }
  9. }([]);

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

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

[javascript] view plaincopy

  1. /* 查表法(完善版本)  by aimingoo */
  2. pad = function(tbl) {
  3. return function(num, n) {
  4. return (0 >= (n = n-num.toString().length)) ? num : (tbl[n] || (tbl[n] = Array(n+1).join(0))) + num;
  5. }
  6. }([]);

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

[javascript] view plaincopy

  1. /* 查表法(过程式版本)  by aimingoo */
  2. pad = function() {
  3. var tbl = [];
  4. return function(num, n) {
  5. var len = n-num.toString().length;
  6. if (len <= 0) return num;
  7. if (!tbl[len]) tbl[len] = (new Array(len+1)).join(‘0‘);
  8. return tbl[len] + num;
  9. }
  10. }();

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

时间: 2024-08-08 21:51:56

在js中做数字字符串补0的相关文章

Java String字符串补0或空格

原文:http://www.open-open.com/code/view/1471488086408 package cn.com.songjy; import java.text.NumberFormat; //Java 中给数字左边补0 public class NumberFormatTest { public static void main(String[] args) { // 待测试数据 int i = 1; // 得到一个NumberFormat的实例 NumberFormat

JS中如何将字符串转化成日期 日期格式化方法

<!--     /**     * 对Date的扩展,将 Date 转化为指定格式的String     * 月(M).日(d).12小时(h).24小时(H).分(m).秒(s).周(E).季度(q) 可以用 1-2 个占位符     * 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)     * eg:     * (new Date()).pattern("yyyy-MM-dd hh:mm:ss.S") ==> 2006-0

JavaScript实现数字前补“0”的五种方法示例

众所周知JavaScript中的数字是没有前置0的,因此需要我们自己进行操作来添加前置0,而且还得转换成字符串. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 <!DOCTYPE html PUBLI

php在数字前面补0得到固定长度数字的两种方法

比较基础,其实两个内置函数都能实现. 1  sprintf 语法: string sprintf(string format, mixed [args]...); 返回值: 字符串 函数种类: 资料处理 本函数用来将字符串格式化.参数 format 是转换的格式,以百分比符号 % 开始到转换字符为止.而在转换的格式间依序包括了 填空字符.0 的话表示空格填 0:空格是默认值,表示空格就放着. 对齐方式.默认值为向右对齐,负号表向左对齐. 字段宽度.为最小宽度. 精确度.指在小数点后的浮点数位数.

Js中常用的字符串,数组,函数扩展

由于最近辞职在家,自己的时间相对多一点.所以就根据prototytpeJS的API,结合自己正在看的司徒大神的<javascript框架设计>,整理了下Js中常用一些字符串,数组,函数扩展,一来可以练练手,二来也锻炼下自己的代码能力.由于代码里面的注释自认为已经非常详细,所以就直接贴代码了. 1. 字符串扩展: ;(function() { var method, stringExtends = { /** * 删除字符串开始和结尾的空白 * @returns {string} */ stri

js中Number数字相乘后值不对

问题: 37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) 我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会这样,两个只有一位小数的数字相乘,怎么可能多出这么小数点出来. 我Google了一下,发现原来这是JavaScript浮点运算的一个bug. 比如:7*0.8 JavaScript算出来就是:5.6000000000000005解决方法:网上找到了一些解决办法,就是重新写了一些浮点运算的函数. 下面就把这些

js中格式化时间字符串

.net 程序员肯定有遇到过,将一个对象json序列化之后Date 字段 就会转化成 '/Date(1370770323740)/' 这种格式的数据,下面介绍一种在js中,关于时间格式的转换. <script> function formatDate(date, format) { if (!date) return; if (!format) format = "yyyy-MM-dd"; switch(typeof date) { case "string&qu

String字符串补0操作常见方法

String前补0 java的String字符串补0或空格 方法一:自己写的方法 /* *数字不足位数左补0** @param str* @param strLength*/public static String addZeroForNum(String str, int strLength) {int strLen = str.length();if (strLen < strLength) {while (strLen < strLength) {StringBuffer sb = ne

[转]JS中对象与字符串的互相转换

原文地址:http://www.cnblogs.com/luminji/p/3617160.html 在使用 JSON2.JS 文件的 JSON.parse(data) 方法时候,碰到了问题: throw new SyntaxError('JSON.parse'); 查询资料,大概意思如下: JSON.parse方法在遇到不可解析的字符串时,会抛出SyntaxError异常. 即:JSON.parse(text, reviver),This method parses a JSON text t