Use of String.Format in JavaScript?

后端 未结 19 1918
逝去的感伤
逝去的感伤 2020-12-04 07:59

This is driving me nuts. I believe I asked this exact same question, but I can\'t find it any more (I used Stack Overflow search, Google Search, manually searched my po

相关标签:
19条回答
  • 2020-12-04 08:44

    Adapt the code from MsAjax string.

    Just remove all of the _validateParams code and you are most of the way to a full fledged .NET string class in JavaScript.

    Okay, I liberated the msajax string class, removing all the msajax dependencies. It Works great, just like the .NET string class, including trim functions, endsWith/startsWith, etc.

    P.S. - I left all of the Visual Studio JavaScript IntelliSense helpers and XmlDocs in place. They are innocuous if you don't use Visual Studio, but you can remove them if you like.

    <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);
    
    0 讨论(0)
  • 2020-12-04 08:44

    Here is what I use. I have this function defined in a utility file:

      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;
      }
    

    And I call it like so:

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

    I do not recall where I found this, but it has been very useful to me. I like it because the syntax is the same as the C# version.

    0 讨论(0)
  • 2020-12-04 08:45

    Just make and use this function:

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

    If you don't want to change the str parameter, then before the for loop, clone (duplicate) it to a new string (make a new copy of str), and set the copy in the for loop and at last return it instead of the parameter itself.

    In C# (Sharp) it is simple create to a copy by just calling String.Clone(), but I don't know how in JavaScript, but you can search on Google or surf on the Internet and learn ways to do it.

    I just gave you my idea about string format in JavaScript.

    0 讨论(0)
  • 2020-12-04 08:46

    Aside from the fact that you are modifying the String prototype, there is nothing wrong with the function you provided. The way you would use it is this way:

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

    If you wanted it as a stand-alone function, you could alter it slightly to this:

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

    Vittore's method is also good; his function is called with each additional formating option being passed in as an argument, while yours expects an object.

    What this actually looks like is John Resig's micro-templating engine.

    0 讨论(0)
  • 2020-12-04 08:51

    Here is a useful string formatting function using regular expressions and captures:

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

    Strings can be formatted like C# String.Format:

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

    the format will place the correct variable in the correct spot, even if they appear out of order:

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

    Hope this helps!

    0 讨论(0)
  • 2020-12-04 08:51

    I just started porting Java's String.format() to JavaScript. You might find it useful too.

    It supports basic stuff like this:

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

    Which results in

    Hi Rob, I like icecream.
    

    But also more advanced numberic formatting and date formatting like:

    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
    

    See for more in the examples.

    See here: https://github.com/RobAu/javascript.string.format

    0 讨论(0)
提交回复
热议问题