我正在寻找一个与C/PHP printf()或C#/Java程序员String.Format()(IFormatProvider for.NET)相当的JavaScript。
目前,我的基本要求是数字的千位分隔符格式,但处理大量组合(包括日期)的格式会很好。
我意识到Microsoft的Ajax库提供了String.Format()的一个版本,但我们不希望该框架的全部开销。
我正在寻找一个与C/PHP printf()或C#/Java程序员String.Format()(IFormatProvider for.NET)相当的JavaScript。
目前,我的基本要求是数字的千位分隔符格式,但处理大量组合(包括日期)的格式会很好。
我意识到Microsoft的Ajax库提供了String.Format()的一个版本,但我们不希望该框架的全部开销。
当前回答
我有一个非常接近Peter的解决方案,但它涉及数字和对象情况。
if (!String.prototype.format) {
String.prototype.format = function() {
var args;
args = arguments;
if (args.length === 1 && args[0] !== null && typeof args[0] === 'object') {
args = args[0];
}
return this.replace(/{([^}]*)}/g, function(match, key) {
return (typeof args[key] !== "undefined" ? args[key] : match);
});
};
}
也许处理所有深度案件会更好,但对于我的需要来说,这很好。
"This is an example from {name}".format({name:"Blaine"});
"This is an example from {0}".format("Blaine");
PS:如果你在AngularJS这样的模板框架中使用翻译,这个函数非常酷:
<h1> {{('hello-message'|translate).format(user)}} <h1>
<h1> {{('hello-by-name'|translate).format( user ? user.name : 'You' )}} <h1>
en.json是什么样子的
{
"hello-message": "Hello {name}, welcome.",
"hello-by-name": "Hello {0}, welcome."
}
其他回答
jQueryGlobalize项目中还有Globalize.format,这是jQueryUI的官方全球化服务。当您需要具有文化意识的格式时,这很好。
我使用模板文字方法,如下所示:
export const messages = {
foo: (arg1, arg2) => `Hello ${arg1} ${arg2}`,
bar: (arg1) => `Hello ${arg1}`,
}
从文件中:
console.log(messages.foo('Bar', 'World'))
console.log(messages.bar('Foo'))
虽然不是世界上最推荐的功能,但它确实有效。
如果需要sprintf,只需复制并粘贴相同的函数,并将return console.log(sb)更改为只返回sb。
printf=函数(s,/*args…*/){a=参数;al=a.length;如果(al<=1)返回-2;如果(al>=2&&s.toLowerCase().search(/%[a-z]/)==-1)返回-1;sb=s;对于(i=1;i<=al-1;i++){sb=某人替换(/%[a-z]/,a[i]);}返回控制台日志(sb);}var someString=“您好%s\n现在是%s:%s%s。\n今天是%s\n”;printf(someString,“StackOverflowUser”,“5”,“48”,“PM”,“漂亮”);
String.prototype.format=函数(){var final=字符串(this);for(设i=0;i<arguments.length;i++){final=final.replace(“%s${i+1}”,参数[i])}return final |“”}console.log((“hello%s2 how%s3 you%s1”).format('hi','hello','how'));<h1 id=“text”></h1>
有了sprintf.js,你可以制作一个漂亮的小格式
String.prototype.format = function(){
var _args = arguments
Array.prototype.unshift.apply(_args,[this])
return sprintf.apply(undefined,_args)
}
// this gives you:
"{%1$s}{%2$s}".format("1", "0")
// {1}{0}