在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 一些用法小结
Sep 11 Javascript
IE8 中使用加速器(Activities)
May 14 Javascript
ModelDialog JavaScript模态对话框类代码
Apr 17 Javascript
javascript分页代码(当前页码居中)
Sep 20 Javascript
javascript之Partial Application学习
Jan 10 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
Apr 14 Javascript
浅谈javascript中执行环境(作用域)与作用域链
Dec 08 Javascript
JavaScript使用prototype原型实现的封装继承多态示例
Aug 31 Javascript
JavaScript实现连连看连线算法
Jan 05 Javascript
微信小程序中weui用法解析
Oct 21 Javascript
Openlayers学习之加载鹰眼控件
Sep 28 Javascript
JavaScript实现点击切换验证码及校验
Jan 10 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
4.与数据库的连接
2006/10/09 PHP
php strnatcmp()函数的用法总结
2013/11/27 PHP
thinkPHP框架实现的简单计算器示例
2018/12/07 PHP
使用laravel指定日志文件记录任意日志
2019/10/17 PHP
JavaScript 捕获窗口关闭事件
2009/07/26 Javascript
myeclipse安装jQuery插件的方法
2011/03/29 Javascript
JS获取几种URL地址的方法小结
2014/02/26 Javascript
处理文本部分内容的TextRange对象应用实例
2014/07/29 Javascript
nodejs实现获取当前url地址及url各种参数值
2015/06/25 NodeJs
jQuery EasyUI封装简化操作
2016/09/18 Javascript
Bootstrap基本模板的使用和理解1
2016/12/14 Javascript
简单理解js的冒泡排序
2016/12/19 Javascript
javascript实现页面滚屏效果
2017/01/17 Javascript
JavaScript实现审核流程状态的动态显示进度条
2017/03/15 Javascript
JS库 Highlightjs 添加代码行号的实现代码
2017/09/13 Javascript
angularjs实现过滤并替换关键字小功能
2017/09/19 Javascript
BootStrap TreeView使用实例详解
2017/11/01 Javascript
javaScript强制保留两位小数的输入数校验和小数保留问题
2018/05/09 Javascript
vue实现todolist功能、todolist组件拆分及todolist的删除功能
2019/04/11 Javascript
python中getattr函数使用方法 getattr实现工厂模式
2014/01/20 Python
Python实现的简单dns查询功能示例
2017/05/24 Python
基于Python闭包及其作用域详解
2017/08/28 Python
python操作excel的方法
2018/08/16 Python
浅谈Python的条件判断语句if/else语句
2019/03/21 Python
Python多线程爬取豆瓣影评API接口
2019/10/22 Python
WoolOvers澳洲官方网站:英国针织服装公司
2018/05/13 全球购物
2014年师德承诺书
2014/05/23 职场文书
爱护草坪标语
2014/06/24 职场文书
代领毕业证委托书
2014/08/02 职场文书
村主任群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
毕业论文答辩开场白和答辩技巧
2015/05/27 职场文书
2015小学师德工作总结
2015/07/21 职场文书
golang goroutine顺序输出方式
2021/04/29 Golang
使用CSS设置滚动条样式
2022/01/18 HTML / CSS
nginx之queue的具体使用
2022/06/28 Servers
HTML静态页面获取url参数和UserAgent的实现
2022/08/05 HTML / CSS