在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取得iframe下内容的方法
Nov 18 Javascript
JavaScript中的包装对象介绍
Jan 27 Javascript
Jquery实现简单的轮播效果(代码管用)
Mar 14 Javascript
Angularjs实现多个页面共享数据的方式
Mar 29 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
Feb 16 Javascript
前端开发不得不知的10个最佳ES6特性
Aug 30 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
Mar 29 Javascript
JavaScript多种页面刷新方法小结
Apr 04 Javascript
解决VUE双向绑定失效的问题
Oct 29 Javascript
JS实现transform实现扇子效果
Jan 17 Javascript
js实现mp3录音通过websocket实时传送+简易波形图效果
Jun 12 Javascript
基于Cesium绘制抛物弧线
Nov 18 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读取csv文件内容的详解
2013/06/18 PHP
PHP 函数call_user_func和call_user_func_array用法详解
2014/03/02 PHP
微信公众平台接口开发入门示例
2014/12/24 PHP
PHP获取指定日期是星期几的实现方法
2016/11/30 PHP
PHP水印类,支持添加图片、文字、填充颜色区域的实现
2017/02/04 PHP
swoole_process实现进程池的方法示例
2018/10/29 PHP
JavaScript Event学习第七章 事件属性
2010/02/07 Javascript
使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
2011/04/07 Javascript
使用jQuery实现星级评分代码分享
2014/12/09 Javascript
JavaScript获取浏览器信息的方法
2015/11/20 Javascript
Javascript实现检测客户端类型代码封包
2015/12/03 Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
2016/01/22 Javascript
JS模拟的Map类实现方法
2016/06/17 Javascript
Bootstrap中点击按钮后变灰并显示加载中实例代码
2016/09/23 Javascript
利用JS判断字符串是否含有数字与特殊字符的方法小结
2016/11/25 Javascript
JS弹性运动实现方法分析
2016/12/15 Javascript
数组Array的排序sort方法
2017/02/17 Javascript
求js数组的最大值和最小值的四种方法
2017/03/03 Javascript
JavaScript实现简单动态进度条效果
2018/04/06 Javascript
JavaScript原型对象原理与应用分析
2018/12/27 Javascript
Vue编写可显示周和月模式的日历 Vue自定义日历内容的显示
2019/06/26 Javascript
微信小程序调用后台service教程详解
2020/11/06 Javascript
Pyhthon中使用compileall模块编译源文件为pyc文件
2015/04/28 Python
一篇文章入门Python生态系统(Python新手入门指导)
2015/12/11 Python
flask入门之表单的实现
2018/07/18 Python
Python使用pymongo库操作MongoDB数据库的方法实例
2019/02/22 Python
Python3.6实现带有简单界面的有道翻译小程序
2019/04/16 Python
ubuntu 18.04搭建python环境(pycharm+anaconda)
2019/06/14 Python
python获取Pandas列名的几种方法
2019/08/07 Python
通过celery异步处理一个查询任务的完整代码
2019/11/19 Python
Python 时间戳之获取整点凌晨时间戳的操作方法
2020/01/28 Python
Python递归求出列表(包括列表中的子列表)的最大值实例
2020/02/27 Python
暑期社会实践方案
2014/02/05 职场文书
党风廉政建设责任书
2014/04/14 职场文书
2015年护士节慰问信
2015/03/23 职场文书
公司员工违纪检讨书
2015/05/05 职场文书