在JavaScript中使用String.Format?

这使我疯狂。 我相信我问了这个完全相同的问题,但我不能再find它(我使用堆栈溢出search,谷歌search,手动search我的post,并search我的代码)。

我想要的东西就像C#String.Format,你可以做类似的事情

string format = String.Format("Hi {0}",name); 

当然只是为了JavaScript,一个人给了我一个简单的答案,它不是一个jQuery插件或任何东西,但我认为你做了一些JSON的东西或东西,它的工作,并且很容易使用。

我为了我的生活找不到这个post。

我在我的代码中有这个,但是我似乎无法find任何使用它的东西,我非常确定我已经使用过它了几次:

 String.prototype.format = function(o) { return this.replace(/{([^{}]*)}/g, function(a, b) { var r = o[b]; return typeof r === 'string' ? r : a; } ); }; 

调整来自MsAjaxstring的代码。

只要删除所有的_validateParams代码,你就是在JavaScript中完全成熟的.NETstring类的大部分方法。

好吧,我解放了msajaxstring类,删除了所有的msajax依赖。 它很好用,就像.NETstring类一样,包括trim函数,endsWith / startsWith等等。

PS – 我离开了所有的Visual Studio JavaScript IntelliSense助手和XmlDocs。 如果你不使用Visual Studio,它们是无害的,但是如果你喜欢,你可以将它们删除。

 <script src="script/string.js" type="text/javascript"></script> <script type="text/javascript"> var a = String.format("Hello {0}!", "world"); alert(a); </script> 

String.js

 // String.js - liberated from MicrosoftAjax.js on 03/28/10 by Sky Sanders // permalink: http://stackoverflow.com/a/2534834/2343 /* Copyright (c) 2009, CodePlex Foundation All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of CodePlex Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</textarea> */ (function(window) { $type = String; $type.__typeName = 'String'; $type.__class = true; $prototype = $type.prototype; $prototype.endsWith = function String$endsWith(suffix) { /// <summary>Determines whether the end of this instance matches the specified string.</summary> /// <param name="suffix" type="String">A string to compare to.</param> /// <returns type="Boolean">true if suffix matches the end of this instance; otherwise, false.</returns> return (this.substr(this.length - suffix.length) === suffix); } $prototype.startsWith = function String$startsWith(prefix) { /// <summary >Determines whether the beginning of this instance matches the specified string.</summary> /// <param name="prefix" type="String">The String to compare.</param> /// <returns type="Boolean">true if prefix matches the beginning of this string; otherwise, false.</returns> return (this.substr(0, prefix.length) === prefix); } $prototype.trim = function String$trim() { /// <summary >Removes all leading and trailing white-space characters from the current String object.</summary> /// <returns type="String">The string that remains after all white-space characters are removed from the start and end of the current String object.</returns> return this.replace(/^\s+|\s+$/g, ''); } $prototype.trimEnd = function String$trimEnd() { /// <summary >Removes all trailing white spaces from the current String object.</summary> /// <returns type="String">The string that remains after all white-space characters are removed from the end of the current String object.</returns> return this.replace(/\s+$/, ''); } $prototype.trimStart = function String$trimStart() { /// <summary >Removes all leading white spaces from the current String object.</summary> /// <returns type="String">The string that remains after all white-space characters are removed from the start of the current String object.</returns> return this.replace(/^\s+/, ''); } $type.format = function String$format(format, args) { /// <summary>Replaces the format items in a specified String with the text equivalents of the values of corresponding object instances. The invariant culture will be used to format dates and numbers.</summary> /// <param name="format" type="String">A format string.</param> /// <param name="args" parameterArray="true" mayBeNull="true">The objects to format.</param> /// <returns type="String">A copy of format in which the format items have been replaced by the string equivalent of the corresponding instances of object arguments.</returns> return String._toFormattedString(false, arguments); } $type._toFormattedString = function String$_toFormattedString(useLocale, args) { var result = ''; var format = args[0]; for (var i = 0; ; ) { // Find the next opening or closing brace var open = format.indexOf('{', i); var close = format.indexOf('}', i); if ((open < 0) && (close < 0)) { // Not found: copy the end of the string and break result += format.slice(i); break; } if ((close > 0) && ((close < open) || (open < 0))) { if (format.charAt(close + 1) !== '}') { throw new Error('format stringFormatBraceMismatch'); } result += format.slice(i, close + 1); i = close + 2; continue; } // Copy the string before the brace result += format.slice(i, open); i = open + 1; // Check for double braces (which display as one and are not arguments) if (format.charAt(i) === '{') { result += '{'; i++; continue; } if (close < 0) throw new Error('format stringFormatBraceMismatch'); // Find the closing brace // Get the string between the braces, and split it around the ':' (if any) var brace = format.substring(i, close); var colonIndex = brace.indexOf(':'); var argNumber = parseInt((colonIndex < 0) ? brace : brace.substring(0, colonIndex), 10) + 1; if (isNaN(argNumber)) throw new Error('format stringFormatInvalid'); var argFormat = (colonIndex < 0) ? '' : brace.substring(colonIndex + 1); var arg = args[argNumber]; if (typeof (arg) === "undefined" || arg === null) { arg = ''; } // If it has a toFormattedString method, call it. Otherwise, call toString() if (arg.toFormattedString) { result += arg.toFormattedString(argFormat); } else if (useLocale && arg.localeFormat) { result += arg.localeFormat(argFormat); } else if (arg.format) { result += arg.format(argFormat); } else result += arg.toString(); i = close + 1; } return result; } })(window); 

这是我使用的。 我在一个实用程序文件中定义了这个函数:

  String.format = function() { var s = arguments[0]; for (var i = 0; i < arguments.length - 1; i++) { var reg = new RegExp("\\{" + i + "\\}", "gm"); s = s.replace(reg, arguments[i + 1]); } return s; } 

我称之为:

 var greeting = String.format("Hi, {0}", name); 

我不记得我在哪里find这个,但对我来说这非常有用。 我喜欢它,因为它的语法与C#版本相同。

你可以做一系列replace:

 function format(str) { for(i = 1; i < arguments.length; i++) { str = str.replace('{' + (i - 1) + '}', arguments[i]); } return str; } 

更好的方法是使用replacefunction参数:

 function format(str, obj) { return str.replace(/\{\s*([^}\s]+)\s*\}/g, function(m, p1, offset, string) { return obj[p1] }) } 

这样你可以提供索引和命名参数:

 var arr = ['0000', '1111', '2222'] arr.a = 'aaaa' str = format(" { 0 } , {1}, { 2}, {a}", arr) // returns 0000 , 1111, 2222, aaaa 

这是一个有用的string格式化函数使用正则expression式和捕获:

 function format (fmtstr) { var args = Array.prototype.slice.call(arguments, 1); return fmtstr.replace(/\{(\d+)\}/g, function (match, index) { return args[index]; }); } 

string可以像C#String.Format格式化:

 var str = format('{0}, {1}!', 'Hello', 'world'); console.log(str); // prints "Hello, world!" 

格式将正确的variables放在正确的位置,即使它们出现乱序:

 var str = format('{1}, {0}!', 'Hello', 'world'); console.log(str); // prints "world, Hello!" 

希望这可以帮助!

没有第三方function:

 string format = "Hi {0}".replace('{0}', name) 

有了多个参数:

 string format = "Hi {0} {1}".replace('{0}', name).replace('{1}', lastname) 

基于@ roydukkey的答案,为运行时(caching正则expression式)更加优化一点:

 (function () { if (!String.prototype.format) { var regexes = {}; String.prototype.format = function (parameters) { for (var formatMessage = this, args = arguments, i = args.length; --i >= 0;) formatMessage = formatMessage.replace(regexes[i] || (regexes[i] = RegExp("\\{" + (i) + "\\}", "gm")), args[i]); return formatMessage; }; if (!String.format) { String.format = function (formatMessage, params) { for (var args = arguments, i = args.length; --i;) formatMessage = formatMessage.replace(regexes[i - 1] || (regexes[i - 1] = RegExp("\\{" + (i - 1) + "\\}", "gm")), args[i]); return formatMessage; }; } } })(); 

.NET Framework中的String.Format方法具有多个签名 。 我最喜欢的一个在其原型中使用了params关键字,即:

 public static string Format( string format, params Object[] args ) 

使用这个版本,你不仅可以传递可变数量的参数,还可以传递一个数组参数。

因为我喜欢杰里米提供的简单解决scheme,所以我想扩展一下:

 var StringHelpers = { format: function(format, args) { var i; if (args instanceof Array) { for (i = 0; i < args.length; i++) { format = format.replace(new RegExp('\\{' + i + '\\}', 'gm'), args[i]); } return format; } for (i = 0; i < arguments.length - 1; i++) { format = format.replace(new RegExp('\\{' + i + '\\}', 'gm'), arguments[i + 1]); } return format; } }; 

现在,您可以按照以下方式使用您的JavaScript版本的String.Format

 StringHelpers.format("{0}{1}", "a", "b") 

 StringHelpers.format("{0}{1}", ["a", "b"]) 

以下是一个只适用于String.prototype的解决scheme:

 String.prototype.format = function() { var s = this; for (var i = 0; i < arguments.length; i++) { var reg = new RegExp("\\{" + i + "\\}", "gm"); s = s.replace(reg, arguments[i]); } return s; } 

只要制作和使用这个function:

 function format(str, args) { for (i = 0; i < args.length; i++) str = str.replace("{" + i + "}", args[i]); return str; } 

如果你不想改变str参数,那么在for循环之前,将它复制(复制)到一个新的string(创build一个str的新副本),然后在for循环中设置副本,最后返回它的参数本身。

在C#(Sharp)中,通过调用String.Clone() )可以很简单地创build一个副本,但是我不知道如何在JavaScript中使用,但是您可以在Google上search或者在Internet上浏览并学习如何去做。

我只是给了你关于JavaScript中string格式的想法。

在ECMAScript 6中使用模板文字:

 var customer = { name: "Foo" } var card = { amount: 7, product: "Bar", unitprice: 42 } var message = `Hello ${customer.name}, want to buy ${card.amount} ${card.product} for a total of ${card.amount * card.unitprice} bucks?` 

除了你正在修改string原型的事实,你提供的函数没有任何错误。 你会用它的方式是这样的:

 "Hello {0},".format(["Bob"]); 

如果你想要它作为一个独立的function,你可以稍微改变它:

 function format(string, object) { return string.replace(/{([^{}]*)}/g, function(match, group_match) { var data = object[group_match]; return typeof data === 'string' ? data : match; } ); } 

维托雷的方法也不错, 他的函数被调用,每个额外的格式化选项被作为参数传入,而你的期望是一个对象。

这实际上是John Resig的微模板引擎 。

你的函数已经把一个JSON对象作为参数:

 string format = "Hi {foo}".replace({ "foo": "bar", "fizz": "buzz" }); 

如果你注意到,代码:

 var r = o[b]; 

看看你的参数(o)并使用一个键值对来解决“replace”

这是一个允许原型和function选项的解决scheme。

 // -------------------------------------------------------------------- // Add prototype for 'String.format' which is c# equivalent // // String.format("{0} i{2}a night{1}", "This", "mare", "s "); // "{0} i{2}a night{1}".format("This", "mare", "s "); // -------------------------------------------------------------------- if(!String.format) String.format = function(){ for (var i = 0, args = arguments; i < args.length - 1; i++) args[0] = args[0].replace("{" + i + "}", args[i + 1]); return args[0]; }; if(!String.prototype.format && String.format) String.prototype.format = function(){ var args = Array.prototype.slice.call(arguments).reverse(); args.push(this); return String.format.apply(this, args.reverse()) }; 

请享用。

我刚刚开始将Java的String.format()移植到JavaScript。 你也可能觉得它很有用。

它支持这样的基本的东西:

 StringFormat.format("Hi %s, I like %s", ["Rob", "icecream"]); 

哪个结果

 Hi Rob, I like icecream. 

但也更先进的数字格式和date格式如:

 StringFormat.format("Duke's Birthday: %1$tA %1$te %1$tB, %1$tY", [new Date("2014-12-16")]); Duke's Birthday: Tuesday 16 December, 2014 

请参阅示例中的更多内容。

看到这里: https : //github.com/RobAu/javascript.string.format

 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}-{1}'.format('a','b'); // Result: 'ab' 

的jsfiddle

使用sprintf库

在这里你有一个链接 ,你可以find这个库的function。

 //Add "format" method to the string class //supports: "Welcome {0}. You are the first person named {0}".format("David"); // and "First Name:{} Last name:{}".format("David","Wazy"); // and "Value:{} size:{0} shape:{1} weight:{}".format(value, size, shape, weight) String.prototype.format = function () { var content = this; for (var i = 0; i < arguments.length; i++) { var target = '{' + i + '}'; content=content.split(target).join(String(arguments[i])) content = content.replace("{}", String(arguments[i])); } return content; } alert("I {} this is what {2} want and {} works for {2}!".format("hope","it","you")) 

您可以使用此function使用位置和“指定”replace位置进行混合和匹配。

这是我的两分钱 :

 function stringFormat(str) { if (str !== undefined && str !== null) { str = String(str); if (str.trim() !== "") { var args = arguments; return str.replace(/(\{[^}]+\})/g, function(match) { var n = +match.slice(1, -1); if (n >= 0 && n < args.length - 1) { var a = args[n + 1]; return (a !== undefined && a !== null) ? String(a) : ""; } return match; }); } } return ""; } alert(stringFormat("{1}, {0}. You're looking {2} today.", "Dave", "Hello", Math.random() > 0.5 ? "well" : "good"));