相当于printf / string.format的JavaScript
我正在寻找C / PHP printf()
或C#/ Java程序员的String.Format()
(用于.NET的IFormatProvider
)的JavaScript等价物。
我现在的基本要求是数字分隔格式,但处理大量组合(包括日期)的东西会很好。
我意识到微软的Ajax库提供了一个String.Format()
版本,但我们不希望这个框架的整个开销。
试用JavaScript的sprintf()。
更新好吧,如果你真的想自己做一个简单的格式化方法,不要连续进行替换,而是同时进行替换。
由于大多数提及的其他提议都失败,因为以前替换的替换字符串也包含如下所示的格式序列:
"{0}{1}".format("{1}", "{0}")
通常情况下,您会希望输出为{1}{0}
但实际输出为{1}{1}
。 所以做一个同时更换,而不是像在恐惧噬菌的建议。
建立在以前建议的解决方案上:
// First, checks if it isn't implemented yet.
if (!String.prototype.format) {
String.prototype.format = function() {
var args = arguments;
return this.replace(/{(d+)}/g, function(match, number) {
return typeof args[number] != 'undefined'
? args[number]
: match
;
});
};
}
"{0} is dead, but {1} is alive! {0} {2}".format("ASP", "ASP.NET")
输出
ASP已死,但ASP.NET还活着! ASP {2}
如果你不想修改String
的原型:
if (!String.format) {
String.format = function(format) {
var args = Array.prototype.slice.call(arguments, 1);
return format.replace(/{(d+)}/g, function(match, number) {
return typeof args[number] != 'undefined'
? args[number]
: match
;
});
};
}
给你更熟悉的:
String.format('{0} is dead, but {1} is alive! {0} {2}', 'ASP', 'ASP.NET');
结果相同:
ASP已死,但ASP.NET还活着! ASP {2}
这很有趣,因为堆栈溢出实际上对于名为formatUnicorn
的String
原型具有自己的格式化函数。 尝试一下! 进入控制台并输入如下所示的内容:
"Hello, {name}, are you feeling {adjective}?".formatUnicorn({name:"Gabriel", adjective: "OK"});
你得到这个输出:
Hello, Gabriel, are you feeling OK?
您可以使用对象,数组和字符串作为参数! 我得到了它的代码,并重新编写了一个新的String.prototype.format
版本:
String.prototype.formatUnicorn = String.prototype.formatUnicorn ||
function () {
"use strict";
var str = this.toString();
if (arguments.length) {
var t = typeof arguments[0];
var key;
var args = ("string" === t || "number" === t) ?
Array.prototype.slice.call(arguments)
: arguments[0];
for (key in args) {
str = str.replace(new RegExp("{" + key + "}", "gi"), args[key]);
}
}
return str;
};
请注意聪明的Array.prototype.slice.call(arguments)
调用 - 这意味着如果抛出的是字符串或数字的参数,而不是单个JSON样式的对象,那么您几乎可以得到C#的String.Format
行为。
"a{0}bcd{1}ef".formatUnicorn("foo", "bar"); // yields "aFOObcdBARef"
这是因为Array
的slice
会将arguments
中的所有arguments
强制到Array
,无论它是否是原来的,并且key
将是每个数组元素的索引(0,1,2 ...)强制为一个字符串(例如, “0”,所以"{0}"
为您的第一个正则表达式模式)。
整齐。
链接地址: http://www.djcxy.com/p/3917.html