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}}}这样的只会被替换成{'结果'},{{'结果'}}。

