通常遇到的一个问题是日期的“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
月影在这里分析了其中的技巧,以及代码长短与效率上的平衡:
http://hi.baidu.com/akira_cn/blog/item/90ba2a8b07c867dafc1f1045.html
最后月影推荐的是“质朴长存法”:
/* 质朴长存法 by lifesinger */
function pad(num, n) {
var len = num.toString().length;
while(len < n) {
num = "0" + num;
len++;
}
return num;
}
这个在“没事就射鸟”同学的博客里做了分析:
http://lifesinger.org/blog/2009/08/the-harm-of-tricky-code/
月同学有一件事是没有做的,就是没说明“为什么那个短代码的效率更低?”。
答案是“表面看来,用array.join来替代循环是高效的,但忘掉了一个数组创建的开销”。对此有没有法子呢?我有过另一个解决的思路。如下:
/*查表法(不完善) byaimingoo */
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时,也就变成了“补负数个零”。“补负数个零”显然不行,一般对此处理成“不需要补零”,于是又回到了第一个问题。
这两个问题可以一次解决,其实就是多一次判断:
/*查表法(完善版本) byaimingoo */
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;
}
}([]);
当然,也可以象前面一样整理一下这个代码格式。或者,采用一个完全不用“(函数式语言的)连续运算等技巧”的版本:
/*查表法(过程式版本) byaimingoo */
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中,对数字进行四舍五入并指定小数位数是一项常见的操作。这个操作在各种场景下都很有用,比如处理价格、计算精度较高的数值或者格式化显示数据。题目中提到的`RoundNumber`函数就是一个这样的工具,它...
在JavaScript中,生成"yyyymmddhhmmss"这样的日期时间字符串是一项常见的需求,它通常用于文件命名、日志记录或者数据库存储等场景,以便于排序和检索。这个字符串格式包含年(4位数)、月(2位数)、日(2位数)、...
这通常用于确保数字字符串具有固定的宽度,例如两位数的月份可能会补零成为"01"、"02"等。 在JavaScript中,我们可以自定义字符串原型方法来实现这个功能。以下是一个示例: ```javascript String.prototype....
在JavaScript中去除字符串中的空格是开发过程中常见的需求,可以通过多种方式实现。本文将详细介绍如何使用正则表达式、字符串函数以及自定义函数来去除字符串中的空格。 首先,我们可以使用JavaScript的字符串替换...
3. 编写`NumberToChinese`主函数,将输入的阿拉伯数字除以10000得到的小节,通过`SectionToChinese`函数处理,然后组合成完整的中文数字字符串。 对于中文数字转阿拉伯数字,我们需要做以下工作: 1. 设计映射表,...
这个库是有用的方法和猴子补丁的集合,这些方法和猴子补丁适用于Javascript中的数组,对象,数字和字符串。 就像编写Ruby代码一样,开始编写Javascript! 在浏览器和NodeJS中均可使用。 缩小并压缩成5.1kb。 安装...
js引擎会将/正则表达式/“”转换成一个RegExp对象,当字符串满足正则表达式的要求事,返回true。 我写的一个表达式验证示例:功能如下: 用户名,不能为空 密码6为数字 密码确认,两次输入密码必须相同 身份证号码...
为了在转换过程中对数字进行格式化,比如在转换为二进制、八进制或十六进制字符串时补齐位数,JavaScript提供了一种自定义函数的方式。例如,可以定义一个名为format的函数,该函数接收两个参数:num表示需要补齐的...
在实际应用中,我们经常遇到未规范化的Json字符串,比如缺失引号、换行和缩进混乱等问题。这款工具能够自动识别并修复这些问题,确保Json字符串符合RFC 7159标准。 格式化功能是将紧凑的Json字符串转换为易读的格式...
本文通过多种实现方式给大家介绍了JS计算两个数组的交集、差集、并集、补集 的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
众所周知JavaScript中的数字是没有前置0的,因此需要我们自己进行操作来添加前置0,而且还得转换成字符串。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...
总结,`Array.from()`是JavaScript中处理数组和类似数组对象的强大工具,可以轻松地从字符串中生成数组,并进行各种自定义操作。了解并熟练掌握这一方法,能够显著提高编写高效、灵活代码的能力。
在上述代码中,我们通过实例演示了如何调用`formatNum`函数,并传入不同的数字字符串参数,以展示函数的通用性和灵活性。通过代码的输出,我们可以观察到格式化结果均按照每三位数字加逗号的规则成功展示。 最后,...
加号 (`+`) 和减号 (`-`) 在 JavaScript 中有多种用途,不仅可以用作数学运算,还可以用于字符串拼接和类型转换: ```javascript var result = 5 + 5; // 10 var result = 5 + "5"; // "55" var result = 5 - true; ...
在JavaScript编程中,有时我们需要将数字格式化成固定长度,特别是在处理序列号、时间戳或者在数据展示时保持一致的视觉效果。本文介绍的三种方法就是解决这个问题的,即为数字前面填充零以达到指定的长度。以下是...
转换器:字符串中仅允许包含字符,数字,破折号和下划线。 不得以破折号或数字开头,默认情况下允许在开头加上下划线,并且可以通过参数来允许/删除/控制下划线(例如,用于私有方法时)内容用法您可以将静态...