在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 相关文章推荐
ExtJS 入门
Oct 29 Javascript
ASP.NET jQuery 实例11 通过使用jQuery validation插件简单实现用户登录页面验证功能
Feb 03 Javascript
Mac地址验证的javascript代码
Nov 09 Javascript
复制网页内容,粘贴之后自动加上网址的实现方法(脚本之家特别整理)
Oct 16 Javascript
jquery实现鼠标滑过小图时显示大图的方法
Jan 14 Javascript
JavaScript中Null与Undefined的区别解析
Jun 30 Javascript
jquery自定义插件开发之window的实现过程
May 06 Javascript
AngularJS 遇到的小坑与技巧小结
Jun 07 Javascript
javascript中call,apply,bind函数用法示例
Dec 19 Javascript
详解Vue 动态组件与全局事件绑定总结
Nov 11 Javascript
layui异步加载table表中某一列数据的例子
Sep 16 Javascript
使用JS实现简易计算器
Jun 14 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中获取远程客户端的真实ip地址的方法
2011/08/03 PHP
javascript function、指针及内置对象
2009/02/19 Javascript
javascript 读取图片文件的大小
2009/06/25 Javascript
jquery 学习之二 属性 文本与值(text,val)
2010/11/25 Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
2013/11/03 Javascript
动态加载脚本提升javascript性能
2014/02/24 Javascript
JQuery each()嵌套使用小结
2014/04/18 Javascript
基于jQuery的JavaScript模版引擎JsRender使用指南
2014/12/29 Javascript
基于JS分页控件实现简单美观仿淘宝分页按钮效果
2016/11/07 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
2016/12/09 Javascript
jQuery 全选 全不选 事件绑定的实现代码
2017/01/23 Javascript
JQuery实现图片轮播效果
2017/05/08 jQuery
vue-cli脚手架-bulid下的配置文件
2018/03/27 Javascript
Bootstrap 模态框自定义点击和关闭事件详解
2018/08/10 Javascript
对vue中methods互相调用的方法详解
2018/08/30 Javascript
layui输入框只允许输入中文且判断长度的例子
2019/09/18 Javascript
非常漂亮的js烟花效果
2020/03/10 Javascript
Vue中登录验证成功后保存token,并每次请求携带并验证token操作
2020/09/08 Javascript
python处理文本文件并生成指定格式的文件
2014/07/31 Python
Python的装饰器模式与面向切面编程详解
2015/06/21 Python
Windows系统下多版本pip的共存问题详解
2017/10/10 Python
Python 随机生成测试数据的模块:faker基本使用方法详解
2020/04/09 Python
python 装饰器的基本使用
2021/01/13 Python
如何用python实现一个HTTP连接池
2021/01/14 Python
加拿大知名的国际儿童品牌:Hatley
2016/11/09 全球购物
亚洲最大的眼镜批发商和零售商之一:Glasseslit
2018/10/08 全球购物
美国在线打印网站:Overnight Prints
2018/10/11 全球购物
当文件系统受到破坏时,如何检查和修复系统?
2012/03/09 面试题
农村婚礼证婚词
2014/01/08 职场文书
模特大赛策划方案
2014/05/28 职场文书
企业宗旨标语
2014/06/10 职场文书
国家税务局领导班子对照检查材料思想汇报
2014/10/04 职场文书
党建工作目标管理责任书
2015/01/29 职场文书
早上好问候语大全
2015/11/10 职场文书
Python内置数据类型中的集合详解
2022/03/18 Python
详解NumPy中的线性关系与数据修剪压缩
2022/05/25 Python