在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 相关文章推荐
测试JavaScript字符串处理性能的代码
Dec 07 Javascript
基于pthread_create,readlink,getpid等函数的学习与总结
Jul 17 Javascript
jQuery中:text选择器用法实例
Jan 03 Javascript
实例剖析AngularJS框架中数据的双向绑定运用
Mar 04 Javascript
简单的js计算器实现
Oct 26 Javascript
如何正确理解javascript的模块化
Mar 02 Javascript
jQuery实现frame之间互通的方法
Jun 26 jQuery
Angular指令之restict匹配模式的详解
Jul 27 Javascript
详解vue移动端日期选择组件
Feb 22 Javascript
JS改变页面颜色源码分享
Feb 24 Javascript
AngularJS实现的自定义过滤器简单示例
Feb 02 Javascript
vue 子组件watch监听不到prop的解决
Aug 09 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开发过程中常用函数收藏
2009/12/14 PHP
php foreach正序倒序输出示例代码
2014/07/01 PHP
php中JSON的使用与转换
2015/01/14 PHP
从刷票了解获得客户端IP的方法
2015/09/21 PHP
[Web]防止用户复制页面内容和另存页面的方法
2009/02/06 Javascript
javascript 运算数的求值顺序
2011/08/23 Javascript
Javascript继承(上)——对象构建介绍
2012/11/08 Javascript
js判断选择的时间是否大于今天的代码
2013/08/20 Javascript
Javascript中Event属性搜集整理
2013/09/17 Javascript
基于JQuery制作可编辑的表格特效
2014/12/23 Javascript
12行javascript代码绘制一个八卦图
2015/04/02 Javascript
jquery实现可旋转可拖拽的文字效果代码
2016/01/27 Javascript
基于jQuery实现仿QQ空间送礼物功能代码
2016/05/24 Javascript
AngularJS使用ocLazyLoad实现js延迟加载
2017/07/05 Javascript
Vue中添加手机验证码组件功能操作方法
2017/12/07 Javascript
jquery中done和then的区别(详解)
2017/12/19 jQuery
利用weixin-java-miniapp生成小程序码并直接返回图片文件流的方法
2019/03/29 Javascript
[04:28]DOTA2亚洲邀请赛小组赛第五日 TOP10精彩集锦
2015/02/03 DOTA
[05:09]2016国际邀请赛中国区预选赛淘汰赛首日精彩回顾
2016/06/29 DOTA
Python 条件判断的缩写方法
2008/09/06 Python
Python内置函数OCT详解
2016/11/09 Python
Python爬虫抓取代理IP并检验可用性的实例
2018/05/07 Python
在Python中输入一个以空格为间隔的数组方法
2018/11/13 Python
台湾线上百货零售购物平台:friDay购物
2017/08/18 全球购物
英国领先的互联网葡萄酒礼品商:Vintage Wine & Port
2019/05/24 全球购物
瑞士男士时尚网上商店:Babista
2020/05/14 全球购物
阿迪达斯越南官网:adidas越南
2020/07/19 全球购物
房屋租赁委托书范本
2014/10/04 职场文书
店铺转让协议书
2014/12/02 职场文书
员工旷工检讨书
2015/08/15 职场文书
七年级作文之游记
2019/12/11 职场文书
Angular CLI发布路径的配置项浅析
2021/03/29 Javascript
go设置多个GOPATH的方式
2021/05/05 Golang
Mysql外键约束的创建与删除的使用
2022/03/03 MySQL
vue组件冲突之引用另一个组件出现组件不显示的问题
2022/04/13 Vue.js
什么是css原子化,有什么用?
2022/04/24 HTML / CSS