String.Format in javascript

来源:互联网 发布:网络舆情刊物 编辑:程序博客网 时间:2024/04/30 10:57

有些时候,我们确实需要在JavaScript中进行字符串替换,类似于C#中的String.Format()方法一样,只不过这种格式化替换只局限于对由'{0}','{1}','{2}'...所组成的“占位符”进行字符串替换,而并不会像C#中可以进行字符串格式化替换。这会大量简化我们的代码,使得程序结构变得更加清晰。众所周知,JavaScript中的replace方法默认只能对第一个匹配到的字符串进行替换,如果给定的字符串中存在多个匹配项,则除了第一个匹配项之外其余的部分都不会被替换。因此我们可以借助于正则表达式来进行替换。

  来看看下面这个方法:

复制代码
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 is dead, but ASP.NET is alive! ASP {2}

  注意'{2}'没有被替换,因为参数列表中没有给定对应的值。在该方法中,没有对参数列表和占位符进行严格限制。也就是说,允许占位符中的数字不连续或者一定要从0开始,而且参数列表的数量并不一定要与占位符中的数字完全对应。只对正则表达式匹配到的项进行查找替换。所以该方法可以满足一些基本应用。

  这里还有另外一个JavaScript类库。

复制代码
// String.js - liberated from MicrosoftAjax.js on 03/28/10 by Sky Sanders /*    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);
复制代码
<script src="script/string.js" type="text/javascript"></script><script type="text/javascript">    var a = String.format("Hello {0}!", "world");    alert(a);</script>

   另外,我的另一篇博客中有关于如何在JavaScript中对字符串进行Trim操作的例子:

0 0
原创粉丝点击