在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控制表格奇偶行及活动行颜色
Apr 20 Javascript
常用jQuery选择器总结
Jul 11 Javascript
原生Javascript封装的一个AJAX函数分享
Oct 11 Javascript
jQuery+ajax实现无刷新级联菜单示例
May 21 Javascript
jQuery选择器总结之常用元素查找方法
Aug 04 Javascript
Dropzone.js实现文件拖拽上传功能(附源码下载)
Nov 22 Javascript
详解Vue.js基于$.ajax获取数据并与组件的data绑定
May 26 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
Sep 21 Javascript
Puppeteer环境搭建的详细步骤
Sep 21 Javascript
JQuery事件冒泡和默认行为代码实例
May 13 jQuery
详解Webpack4多页应用打包方案
Jul 16 Javascript
解决vue $http的get和post请求跨域问题
Jun 07 Vue.js
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
使用Apache的rewrite技术
2006/06/22 PHP
PHP的面向对象编程
2006/10/09 PHP
PHP脚本的10个技巧(1)
2006/10/09 PHP
Ping服务的php实现方法,让网站快速被收录
2012/02/04 PHP
JavaScript delete操作符应用实例
2009/01/13 Javascript
editable.js 基于jquery的表格的编辑插件
2011/10/24 Javascript
js获取单选框或复选框值及操作
2012/12/18 Javascript
javascript鼠标右键菜单自定义效果
2020/12/08 Javascript
jQuery基于扩展简单实现倒计时功能的方法
2016/05/14 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(二)
2016/09/14 Javascript
为jQuery-easyui的tab组件添加右键菜单功能的简单实例
2016/10/10 Javascript
jquery.zclip轻量级复制失效问题
2017/01/08 Javascript
微信小程序本地缓存数据增删改查实例详解
2017/05/24 Javascript
ES6中Array.find()和findIndex()函数的用法详解
2017/09/16 Javascript
Vue 与 Vuex 的第一次接触遇到的坑
2018/08/16 Javascript
详解如何在webpack中做预渲染降低首屏空白时间
2018/08/22 Javascript
如何使用python爬取csdn博客访问量
2016/02/14 Python
python实现多线程行情抓取工具的方法
2018/02/28 Python
Pytorch中Tensor与各种图像格式的相互转化详解
2019/12/26 Python
基于python求两个列表的并集.交集.差集
2020/02/10 Python
解决PDF 转图片时丢文字的一种可能方式
2021/03/04 Python
AmazeUI中模态框的实现
2020/08/19 HTML / CSS
LookFantastic丹麦:英国美容护肤精品在线商城
2016/08/18 全球购物
PHP如何删除一个Cookie值
2012/11/15 面试题
信息技术专业个人自我评价
2013/12/11 职场文书
单位人事专员介绍信
2014/01/11 职场文书
大四学生思想汇报
2014/01/13 职场文书
《草虫的村落》教学反思
2014/02/16 职场文书
办公自动化专业大学生职业规划书
2014/03/06 职场文书
纪检监察建议书
2014/05/19 职场文书
机电专业求职信
2014/06/14 职场文书
师德师风自查总结
2014/10/14 职场文书
协议书范文
2015/01/27 职场文书
Python WSGI 规范简介
2021/04/11 Python
Pytorch 如何加速Dataloader提升数据读取速度
2021/05/28 Python
MySQL 常见的数据表设计误区汇总
2021/06/07 MySQL