我尝试在JS中创建一个String.format函数,就像C#一样,所以我不必做foo + ", " + bar
并做"{0}, {1}".format(foo, bar);
我只有使用{我得到了一些非常好的结果{1}}。
{0}
除了String.prototype.format = function() {
var replacement = "";
for (var i = 0; i < arguments.length; i++) {
replacement += this.replace("{" + i + "}", arguments[i]);
}
return replacement;
};
执行:"{0} {1}".format("foo", "bar");
或SyntaxError之外。尽管如此,我从来没有像这样更换任何错误。
答案 0 :(得分:2)
解决此问题的最佳方法是使用replace
上的函数回调和全局替换搜索:
Object.defineProperty(String.prototype, "format", {
value: function() {
var args = arguments;
return this.replace(/\{(\d+)\}/g, function(m, c0) {
return args[c0] || "";
});
}
});
console.log("testing {0}, {1}, {2}".format("one", "two", "three"));
&#13;
这有几个原因比重复调用replace
更好:
{n}
不会造成麻烦。请注意,我使用Object.defineProperty
来避免在String.prototype
上创建可枚举的属性。
正则表达式的工作原理是捕获{}
之间的任何数字。然后,我们使用生成的捕获来查找给予arguments
的原始String.prototype.format
的替换。
请注意|| ""
。如果没有48个参数,那将用零替换{47}
。如果您希望保留{47}
,请将其更改为|| m
。
在ES2015及以上版本中,我们这样做:
Object.defineProperty(String.prototype, "format", {
value: function(...args) {
return this.replace(/\{(\d+)\}/g, (m, c0) => args[c0] || "");
}
});
console.log("testing {0}, {1}, {2}".format("one", "two", "three"));
&#13;
答案 1 :(得分:0)
我认为这会对你有帮助。
String.prototype.format = function() {
var replacement = this;
for (var i = 0; i < arguments.length; i++) {
var regexp = new RegExp('\\{'+i+'\\}', 'gi');
replacement = replacement .replace(regexp, arguments[i]);
}
return replacement;
};