您的位置:首页 > Web前端 > JavaScript

[优化]JavaScript 格式化带有占位符字符串

2012-08-03 20:38 555 查看
/**
* Format a message with placeholder.
*
* Examples:
* format("X{0}Y{1}Z{2}") : XYZ
* format("X{0}Y{1}Z{2}", '1') : X1YZ
* format("X{0}Y{1}Z{2}", '1', '2') : X1Y2Z
* format("X{0}Y{1}Z{2}", '1', '2', '3') : X1Y2Z3
* format("X{0}Y{1}Z{2}", '1', '2', '3', '4') : X1Y2Z3
* ------------------------------------
* format() : null
* format("X{0}Y{1}Z{2}", null) : XYZ
* format(null, '1') : null
* ------------------------------------
* format("{0{0}1{1}2{2}}") : {012}
* format("{0{0}1{1}2{2}}", 'x') : {0x12}
* format("{0{0}1{1}2{2}}", 'x', 'y') : {0x1y2}
* format("{0{0}1{1}2{2}}", 'x', 'y', 'z') : {0x1y2z}
*
* @Author http://blog.csdn.net/xxd851116 */
function format( message ) {
if (!message) return null;
var ss = message.split(/\{\d+?\}/);
for ( var i = 0; i < ss.length; i++ ) {
if (!arguments[i + 1]) break;
ss[i] += arguments[i + 1];
}
return ss.join("");
}


测试用例:

document.writeln("format(\"X{0}Y{1}Z{2}\") : "						+ format("X{0}Y{1}Z{2}") + "<br/>");
document.writeln("format(\"X{0}Y{1}Z{2}\", '1') : "					+ format("X{0}Y{1}Z{2}", '1') + "<br/>");
document.writeln("format(\"X{0}Y{1}Z{2}\", '1', '2') : "			+ format("X{0}Y{1}Z{2}", '1', '2') + "<br/>");
document.writeln("format(\"X{0}Y{1}Z{2}\", '1', '2', '3') : "		+ format("X{0}Y{1}Z{2}", '1', '2', '3') + "<br/>");
document.writeln("format(\"X{0}Y{1}Z{2}\", '1', '2', '3', '4') : "	+ format("X{0}Y{1}Z{2}", '1', '2', '3', '4') + "<br/>");

document.writeln("<hr />");

document.writeln("format() : "										+ format() + "<br/>");
document.writeln("format(\"X{0}Y{1}Z{2}\", null) : "				+ format("X{0}Y{1}Z{2}", null) + "<br/>");
document.writeln("format(null, '1') : "								+ format(null, '1') + "<br/>");

document.writeln("<hr />");
document.writeln("format(\"{0{0}1{1}2{2}}\") : "					+ format("{0{0}1{1}2{2}}") + "<br/>");
document.writeln("format(\"{0{0}1{1}2{2}}\", 'x') : "				+ format("{0{0}1{1}2{2}}", 'x') + "<br/>");
document.writeln("format(\"{0{0}1{1}2{2}}\", 'x', 'y') : "			+ format("{0{0}1{1}2{2}}", 'x', 'y') + "<br/>");
document.writeln("format(\"{0{0}1{1}2{2}}\", 'x', 'y', 'z') : "		+ format("{0{0}1{1}2{2}}", 'x', 'y', 'z') + "<br/>");


上面代码存在参数顺序的bug,感谢KimSoft提出的优化方案:/article/2799238.html

String.prototype.format = function(){
var args = arguments;
return this.replace(/\{(\d+)\}/g,
function(m,i){
return args[i];
});
}

var a = "I Love {0}, and You Love {1},Where are {0}! {4}";
alert(a.format("You","Me"));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: