在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是非常经常变化的,那么效率也不会有太大提升——对于过于频繁变化的系统,缓存就意义不大了。其实逻辑都差不多,月影同学只是少走了一步而已。

(0)

相关推荐

  • js日期时间补零的小例子

    复制代码 代码如下: function getNowFormatDate()         {            var day = new Date();            var Year = 0;            var Month = 0;            var Day = 0;            var CurrentDate = "";            //初始化时间            //Year       = day.getYea

  • JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码

    有时候我们的日期等不足两位的补一个0等,都可以使用这个. 这个大家应该都很明白了,就不废话了,代码如下: String.prototype.padLeft = Number.prototype.padLeft = function(total, pad) { return (Array(total).join(pad || 0) + this).slice(-total); } 测试代码: //补位 "X".padLeft(5, "Y"); //返回:YYYYX (

  • JavaScript 时分秒时间代码(自动补零)

    function startTime() { var today=new Date() var h=today.getHours() var m=today.getMinutes() var s=today.getSeconds() //add a zero in front of numbers which [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行] javascript 补零 函数集合

  • JavaScript如何实现对数字保留两位小数一位自动补零

    本章节介绍一下如何实现对数字保留两位小数效果,如果数字的原本小数位数不到两位,那么缺少的就自动补零,这个也是为了统一的效果,先看代码实例: function returnFloat(value){ var value=Math.round(parseFloat(value)*100)/100; var xsd=value.toString().split("."); if(xsd.length==1){ value=value.toString()+".00"; r

  • javascript添加前置0(补零)的几种方法

    前言 众所周知JavaScript中的数字是没有前置0的,因此需要我们自己进行操作来添加前置0,而且还得转换成字符串. 假如生成一个是一共是4位的有前置0的数据,通常我们能想到的方法是这样子的: function addPreZero(num){ if(num<10){ return '000'+num; }else if(num<100){ return '00'+num; }else if(num<1000){ return '0'+num; }else{ return num; }

  • javascript 补零 函数集合

    在输出整数时如果需要在前面或者后面补零成一定长度可以用以下函数. function padLeft(str,lenght){ if(str.length >= lenght) return str; else return padLeft("0" +str,lenght); } function padRight(str,lenght){ if(str.length >= lenght) return str; else return padRight(str+"

  • JavaScript 空位补零实现代码

    实现一: 复制代码 代码如下: /* 平淡无奇法 */ function pad(num, n) { var i = (num + "").length; while(i++ < n) num = "0" + num; return num; } 上面的代码太平淡无奇,体现不了我的真实水平.于是有了实现二: 复制代码 代码如下: /* 神奇递归法 */ function pad2(num, n) { if ((num + "").lengt

  • JavaScript前补零操作实例

    本文实例讲述了JavaScript前补零操作的方法.分享给大家供大家参考.具体如下: 很多时候为了显示格式,需要在某一字符串不满位的情况下进行前补0操作. 1. 传统代码 /** * 前补0操作 * @param number String 待操作字符串 * @param length int 目标长度 */ function addZero(number, length) { var buffer = ""; if (number == "") { for (va

  • js实现倒计时效果(小于10补零)

    话不多说,请看代码: function checkTime(i) { if (i<10) { i = "0" +i; } return i; }; function GetRTime(t){ h=Math.floor(t/60/60); m=Math.floor(t/60%60); s=Math.floor(t%60); d = checkTime(d); h = checkTime(h); m = checkTime(m); s = checkTime(s); $("

  • JavaScript实现按照指定长度为数字前面补零输出的方法

    本文实例讲述了JavaScript实现按照指定长度为数字前面补零输出的方法.分享给大家供大家参考.具体分析如下: 例如我们希望输出的数字长度是固定的,假设为10,如果数字为123,则输出0000000123,不够位数就在之前补足0,这里提供了三种不同的方式实现JS代码给数字补0 的操作 方法1 function PrefixInteger(num, length) { return (num/Math.pow(10,length)).toFixed(length).substr(2); } 方法

随机推荐