js 小数自动补0_在js中做数字字符串补0(js补零)

news/2024/7/5 23:16:56 标签: js 小数自动补0

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


http://www.niftyadmin.cn/n/1046425.html

相关文章

织梦缩略图自动补齐绝对路径_织梦生成文章内容缩略图时自动加上域名绝对路径...

因为他们是有个PC端和手机端,用的同一个数据库,但是不同的服务器,所以不加绝对路径的话,其中一端的不能显示图片的。大家一般想做这个缩略图自动带上绝对路径的话可能一般有2种思路&#xff1a;在点击上传缩略图和编辑器自动获取第一张图做缩略图的代码处加上域名这个绝对路径,…

如何计算给定一个unigram语言模型_统计语言模型

语言模型概述语言模型(Language Model)&#xff0c;就是用来计算一个句子概率的模型。从统计的角度看&#xff0c;自然语言中的一个句子可以由任何词串构成。不过P(s)有大有小。比如&#xff1a;s1 我 刚 吃 过 晚饭s2 刚 我 过 晚饭 吃可以看出P(s1)>P(s2)。对于给定的句…

查看pg 用户组_PostgreSQL 角色与用户管理介绍

一、角色与用户的区别角色就相当于岗位&#xff1a;角色可以是经理&#xff0c;助理。用户就是具体的人&#xff1a;比如陈XX经理&#xff0c;朱XX助理&#xff0c;王XX助理。在PostgreSQL 里没有区分用户和角色的概念&#xff0c;"CREATE USER" 为 "CREATE ROL…

lisp实战文库_AutoLISP基础入门案例,很受用-推荐下载

语法简单不用特殊的变量宣告,非常富有弹性,比起其它的程序语言,它的语法可说是非常简单而有其独特的风格!功能函数强大除一般性的功能函数外,又拥有为数不少控制配合AutoCAD的特殊函数,再加上AutoLISP可直接呼叫执行所有AutoCAD的指令,以及掌握运用所有的AutoCAD系统变量,功能之…

cdn连接失败是什么意思_CDN经常连接失败的原因有哪些?

原标题&#xff1a;CDN经常连接失败的原因有哪些&#xff1f;相信很多站长在运营网站时会经常遇到这种情况&#xff0c;接入CDN后&#xff0c;CDN连接失败&#xff0c;网站后台或网站的部分页面都也无法正常打开。CDN连接失败原因有很多&#xff0c;一般都是以下情况&#xff1…

简述原型模型的特点_软件工程导论知识点梳理之简答题

1. 软件危机的表现形式对软件开发成本和进度估计不准确已完成的软件不符合用户需求软件产品质量差&#xff0c;可靠性得不到保证软件产品可维护性差软件成本在计算机总成本中的比例逐渐变大软件开发生产率提高速度比不上计算机应用速度2. 产生软件危机的原因(1)软件是计算机系统…

PHP学级与年级的转换函数_php的数组与字符串的转换函数整理汇总

1.将一个字符串转化为数组str_split()用于将一个字符串转化为数组语法&#xff1a;str_split(string,length)//string是必须的&#xff0c;是要分割的字符串&#xff1b;//length是可选的&#xff0c;规定每个数组元素的长度tips:如果 length 小于 1&#xff0c;str_split() 函…

十六、docker学习-docker-compose

官网地址 https://docs.docker.com/compose/compose-file/概述 在实际生产环境中&#xff0c;一个应用往往由许多服务构成&#xff0c;而 docker 的最佳实践是一个容器只运行一个进程&#xff0c;因此运行多个微服务就要运行多个容器。多个容器协同工作需要一个有效的工具来管…