/** * 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}") + "");document.writeln("format(\"X{0}Y{1}Z{2}\", '1') : " + format("X{0}Y{1}Z{2}", '1') + "");document.writeln("format(\"X{0}Y{1}Z{2}\", '1', '2') : " + format("X{0}Y{1}Z{2}", '1', '2') + "");document.writeln("format(\"X{0}Y{1}Z{2}\", '1', '2', '3') : " + format("X{0}Y{1}Z{2}", '1', '2', '3') + "");document.writeln("format(\"X{0}Y{1}Z{2}\", '1', '2', '3', '4') : " + format("X{0}Y{1}Z{2}", '1', '2', '3', '4') + "");document.writeln("
");document.writeln("format() : " + format() + "");document.writeln("format(\"X{0}Y{1}Z{2}\", null) : " + format("X{0}Y{1}Z{2}", null) + "");document.writeln("format(null, '1') : " + format(null, '1') + "");document.writeln("
");document.writeln("format(\"{0{0}1{1}2{2}}\") : " + format("{0{0}1{1}2{2}}") + "");document.writeln("format(\"{0{0}1{1}2{2}}\", 'x') : " + format("{0{0}1{1}2{2}}", 'x') + "");document.writeln("format(\"{0{0}1{1}2{2}}\", 'x', 'y') : " + format("{0{0}1{1}2{2}}", 'x', 'y') + "");document.writeln("format(\"{0{0}1{1}2{2}}\", 'x', 'y', 'z') : " + format("{0{0}1{1}2{2}}", 'x', 'y', 'z') + "");
上面代码存在参数顺序的bug,感谢KimSoft提出的优化方案:
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"));