Javascript String.format
2008-04-17 11:57 | 分类 WebDev | By ming | 2 条评论 »
模仿.net的string.Format方法,进行字符串的格式化。主要是通过替换{数字}来实现。
方法一:
function format1() {
var args = Array.prototype.slice.call(arguments);
/*arguments不是Array,所以要转换成Array*/
if (args.length < 2 || typeof args[0] != 'string')
throw new Error('String Format Invalid');
var format = args.shift();
var l = args.length - 1;
return format.replace(/\{(\d+)\}/g, function($0, $1) {
if (l < $1)
throw new Error('String Format Invalid');
return args[$1];
});
}
方法二:
function format2() {
var args = Array.prototype.slice.call(arguments);
if (args.length < 2 || typeof args[0] != 'string')
throw new Error('String Format Invalid');
var format = args.shift();
var arr = format.match(/\{(\d+)\}/g);
for (var i = 0, l = arr.length; i < l; i++) {
format = format.replace(arr[i], args[i]);
}
return format;
}
/*此方法因欠缺考虑,只能用于逐个替换,现已废弃,请使用方法一
方法三:
function format3() {
if (arguments.length < 2 || typeof arguments[0] != 'string')
throw new Error('String Format Invalid');
var format = arguments[0];
var re = /\{(\d+)\}/g;
for (var i = 1, l = arguments.length - 1; re.test(format); i++) {
if (l < i)
throw new Error('String Format Invalid');
format = format.replace(re, arguments[i]);
}
return format;
} */
经地测试(10000次循环),以上3个函数中format3性能最好(写的时候欠考虑,达不到format目的,此方法现已废弃),format1稍差,format2最差,
(30000次循环)情况下,不过估计没有人会一口气运行这么多次,format1也就比format3稍差一点。(诶,format1看起来多简洁啊,为啥不是最好的呢,看来String.prototype.replace(regexp,function)依靠它的内置循环也不见得是最好的)
使用:
format1('start-{0}-{1}-{2}-{3}-{4}-end','a','b','c','d','e'); 结果 'start-a-b-c-d-e-end'
像{{0}}、{{{0}}}这样的只会被替换成{'结果'},{{'结果'}}。
转载请遵循"署名-非商业性使用-相同方式共享" 的创作共用协议。
留下评论
(如发言后未显示则有待审核)


关于 Javascript String.format 有2条评论
你好
你的format在if (!arguments[i])这里有个bug
当传入的参数为数字0的时候
!arguments[i]也会被转化为bool的true
造成异常
可把判断条件改为 arguments.length < i
嗯,那个的确是我欠考虑了,没有把无意义的几个''、undefined、null、0、false、NaN给考虑进去,谢谢提醒。
决定把现在的format3给废弃了,测试不周到啊
现在决定只用format1这个函数了