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


Posted in Javascript onMarch 25, 2017

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

Javascript 相关文章推荐
动态的改变IFrame的高度实现IFrame自动伸展适应高度
Dec 28 Javascript
jQuery中ajax的使用与缓存问题的解决方法
Dec 19 Javascript
jQuery实现隔行背景色变色
Nov 24 Javascript
javascript 数组的正态分布排序的问题
Jul 31 Javascript
BootStrap中关于Select下拉框选择触发事件及扩展
Nov 22 Javascript
自学实现angularjs依赖注入
Dec 20 Javascript
Vue上传组件vue Simple Uploader的用法示例
Aug 25 Javascript
vue使用自定义icon图标的方法
May 14 Javascript
vue elementUI tree树形控件获取父节点ID的实例
Sep 12 Javascript
Vue组件之单向数据流的解决方法
Nov 10 Javascript
Layui 动态禁止select下拉的例子
Sep 03 Javascript
JS正则表达式常见函数与用法小结
Apr 13 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
Mar 25 #Javascript
JS去掉字符串前后空格或去掉所有空格的用法
Mar 25 #Javascript
javascript作用域链与执行环境详解
Mar 25 #Javascript
vue中用动态组件实现选项卡切换效果
Mar 25 #Javascript
使用vue.js写一个tab选项卡效果
Mar 25 #Javascript
JavaScript 实现 Tab 点击切换实例代码
Mar 25 #Javascript
JS操作xml对象转换为Json对象示例
Mar 25 #Javascript
You might like
PHP中使用CURL伪造来路抓取页面或文件
2011/05/04 PHP
php全角字符转换为半角函数
2014/02/07 PHP
PHP JSON出错:Cannot use object of type stdClass as array解决方法
2014/08/16 PHP
PHP图形计数器程序显示网站用户浏览量
2016/07/20 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
Laravel5框架添加自定义辅助函数的方法
2018/08/01 PHP
PHP设计模式(六)桥连模式Bridge实例详解【结构型】
2020/05/02 PHP
js前台判断开始时间是否小于结束时间
2012/02/23 Javascript
jquery实现的一个导航滚动效果具体代码
2013/05/27 Javascript
window.onresize 多次触发的解决方法
2013/11/08 Javascript
easyui Draggable组件实现拖动效果
2015/08/19 Javascript
jQuery实现给input绑定回车事件的方法
2017/02/09 Javascript
使用vue官方提供的模板vue-cli搭建一个helloWorld案例分析
2018/01/16 Javascript
详解vue填坑之解决部分浏览器不支持pushState方法
2018/07/12 Javascript
Nodejs把接收图片base64格式保存为文件存储到服务器上
2018/09/26 NodeJs
VueCli3构建TS项目的方法步骤
2018/11/07 Javascript
Vue项目引进ElementUI组件的方法
2018/11/11 Javascript
vue 组件开发原理与实现方法详解
2019/11/29 Javascript
vue下canvas裁剪图片实例讲解
2020/04/16 Javascript
Vue v-for中的 input 或 select的值发生改变时触发事件操作
2020/08/31 Javascript
django 2.0更新的10条注意事项总结
2018/01/05 Python
Python网络编程使用select实现socket全双工异步通信功能示例
2018/04/09 Python
Python实现简单的文本相似度分析操作详解
2018/06/16 Python
Python实现html转换为pdf报告(生成pdf报告)功能示例
2019/05/04 Python
python Django 创建应用过程图示详解
2019/07/29 Python
python模拟预测一下新型冠状病毒肺炎的数据
2020/02/01 Python
南非最大的花卉和送礼服务:NetFlorist
2017/09/13 全球购物
美国领先的水果篮送货公司和新鲜水果供应商:The Fruit Company
2018/02/13 全球购物
国际性能运动服装品牌:Dare 2b
2018/07/27 全球购物
大学生个人自我鉴定
2013/12/03 职场文书
仓库保管员岗位职责
2013/12/20 职场文书
党员个人思想汇报
2013/12/28 职场文书
简洁的英文求职信范文
2014/05/03 职场文书
经理任命书模板
2014/06/06 职场文书
贫困证明书范文
2015/06/16 职场文书