在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 相关文章推荐
jQuery Ajax文件上传(php)
Jun 16 Javascript
Jquery AJAX POST与GET之间的区别
Nov 14 Javascript
自己动手实现jQuery Callbacks完整功能代码详解
Nov 25 Javascript
jquery判断浏览器后退时候弹出消息的方法
Aug 11 Javascript
AngularJS基础 ng-srcset 指令简单示例
Aug 03 Javascript
jQuery过滤选择器用法示例
Sep 12 Javascript
扩展jquery easyui tree的搜索树节点方法(推荐)
Oct 28 Javascript
微信JSAPI支付操作需要注意的细节
Jan 10 Javascript
js原生Ajax的封装和原理详解
Mar 11 Javascript
Vue实现双向数据绑定
May 03 Javascript
JS实现全屏预览F11功能的示例代码
Jul 23 Javascript
小程序实现左滑删除效果
Jul 25 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代码
2008/04/09 PHP
php递归删除目录下的文件但保留的实例分享
2014/05/10 PHP
Laravel 5.0 发布 新版本特性详解
2015/02/10 PHP
php实现按天数、星期、月份查询的搜索框
2016/05/02 PHP
PHP微信开发之查询城市天气
2016/06/23 PHP
PHP检查URL包含特定字符串实例方法
2019/02/11 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
2019/05/27 PHP
静态的动态续篇之来点XML
2006/12/23 Javascript
JQuery下关于$.Ready()的分析
2009/12/13 Javascript
jQuery中mouseover事件用法实例
2014/12/26 Javascript
javascript动画之模拟拖拽效果篇
2016/09/26 Javascript
js将当前时间格式化为 年-月-日 时:分:秒的实现代码
2018/01/20 Javascript
Python中os和shutil模块实用方法集锦
2014/05/13 Python
使用实现pandas读取csv文件指定的前几行
2018/04/20 Python
Python爬虫之正则表达式基本用法实例分析
2018/08/08 Python
Python中函数参数调用方式分析
2018/08/09 Python
Python如何把多个PDF文件合并代码实例
2020/02/13 Python
Django正则URL匹配实现流程解析
2020/11/13 Python
碧欧泉美国官网:Biotherm美国
2016/08/31 全球购物
软件测试工程师面试问题精选
2016/10/28 面试题
护理专业个人求职简历的自我评价
2013/10/13 职场文书
大学生活动策划方案
2014/02/10 职场文书
小学生手册家长评语
2014/04/16 职场文书
幼儿园中班上学期评语
2014/04/18 职场文书
出国英文推荐信
2014/05/10 职场文书
软件工程毕业生自荐信
2014/07/04 职场文书
园林专业毕业生自荐信
2014/07/04 职场文书
2014年市场部工作总结
2014/11/25 职场文书
2014年小学体育工作总结
2014/12/11 职场文书
2015年母亲节寄语
2015/03/23 职场文书
2015元旦感言
2015/12/09 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers
Java 在线考试云平台的实现
2021/11/23 Java/Android
通过Python把学姐照片做成拼图游戏
2022/02/15 Python
JS中forEach()、map()、every()、some()和filter()的用法
2022/05/11 Javascript
PostgreSQL常用字符串分割函数整理汇总
2022/07/07 PostgreSQL