全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

在js中做数字字符串补0(js补零)

通常遇到的一个问题是日期的“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是非常经常变化的,那么效率也不会有太大提升——对于过于频繁变化的系统,缓存就意义不大了。其实逻辑都差不多,月影同学只是少走了一步而已。


# js补零  # javascript添加前置0(补零)的几种方法  # JavaScript实现数字前补“0”的五种方法示例  # js正则格式化日期时间自动补0的两种解法  # 不需要  # 数个  # 的是  # 是一个  # 对此  # 有一  # 也不  # 在这里  # 会有  # 这种方法  # 走了  # 第一个  # 也就  # 是这样  # 则是  # 会在  # 这两个  # 不上  # 有过  # 太大 


相关文章: 南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  如何通过虚拟机搭建网站?详细步骤解析  北京的网站制作公司有哪些,哪个视频网站最好?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  如何在建站宝盒中设置产品搜索功能?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  怎么将XML数据可视化 D3.js加载XML  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  安徽网站建设与外贸建站服务专业定制方案  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  企业微网站怎么做,公司网站和公众号有什么区别?  如何设置并定期更换建站之星安全管理员密码?  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站之星如何实现PC+手机+微信网站五合一建站?  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  建站之星安装路径如何正确选择及配置?  如何通过网站建站时间优化SEO与用户体验?  制作网站的软件免费下载,免费制作app哪个平台好?  如何用PHP快速搭建CMS系统?  如何通过IIS搭建网站并配置访问权限?  常州自助建站费用包含哪些项目?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  建站VPS选购需注意哪些关键参数?  c# 在ASP.NET Core中管理和取消后台任务  定制建站如何定义?其核心优势是什么?  如何通过商城免费建站系统源码自定义网站主题?  seo网站制作优化,网站SEO优化步骤有哪些?  5种Android数据存储方式汇总  如何有效防御Web建站篡改攻击?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  开心动漫网站制作软件下载,十分开心动画为何停播?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  高端云建站费用究竟需要多少预算?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  定制建站是什么?如何实现个性化需求?  定制建站哪家更专业可靠?推荐榜单揭晓  建站VPS能否同时实现高效与安全翻墙?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  西安专业网站制作公司有哪些,陕西省建行官方网站?  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  如何快速查询网址的建站时间与历史轨迹?  实例解析angularjs的filter过滤器  TestNG的testng.xml配置文件怎么写  c# 在高并发场景下,委托和接口调用的性能对比 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。