Current JavaScript

From ES6 on you could use template strings:

let soMany = 10;
console.log(`This is ${soMany} times easier!`);
// "This is 10 times easier!"

See Kim's answer below for details.


Older answer

Try sprintf() for JavaScript.


If you really want to do a simple format method on your own, don’t do the replacements successively but do them simultaneously.

Because most of the other proposals that are mentioned fail when a replace string of previous replacement does also contain a format sequence like this:

"{0}{1}".format("{1}", "{0}")

Normally you would expect the output to be {1}{0} but the actual output is {1}{1}. So do a simultaneous replacement instead like in fearphage’s suggestion.

Top answer
1 of 16
1662

Current JavaScript

From ES6 on you could use template strings:

let soMany = 10;
console.log(`This is ${soMany} times easier!`);
// "This is 10 times easier!"

See Kim's answer below for details.


Older answer

Try sprintf() for JavaScript.


If you really want to do a simple format method on your own, don’t do the replacements successively but do them simultaneously.

Because most of the other proposals that are mentioned fail when a replace string of previous replacement does also contain a format sequence like this:

"{0}{1}".format("{1}", "{0}")

Normally you would expect the output to be {1}{0} but the actual output is {1}{1}. So do a simultaneous replacement instead like in fearphage’s suggestion.

2 of 16
1512

Building on the previously suggested solutions:

// 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")

outputs

ASP is dead, but ASP.NET is alive! ASP {2}


If you prefer not to modify String's prototype:

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

Gives you the much more familiar:

String.format('{0} is dead, but {1} is alive! {0} {2}', 'ASP', 'ASP.NET');

with the same result:

ASP is dead, but ASP.NET is alive! ASP {2}

🌐
GeeksforGeeks
geeksforgeeks.org › javascript › javascript-string-formatting
JavaScript String Formatting - GeeksforGeeks
August 5, 2025 - JavaScript, unlike languages like C# or Python, doesn’t support built-in string formatting using {} placeholders.
🌐
MDN Web Docs
developer.mozilla.org › en-US › docs › Web › JavaScript › Reference › Template_literals
Template literals (Template strings) - JavaScript - MDN - Mozilla
Template literals are literals delimited with backtick (`) characters, allowing for multi-line strings, string interpolation with embedded expressions, and special constructs called tagged templates.
🌐
Mozilla
developer.mozilla.org › en-US › docs › Web › JavaScript › Guide › Numbers_and_strings
Numbers and strings - JavaScript - MDN Web Docs - Mozilla
This chapter introduces the two most fundamental data types in JavaScript: numbers and strings. We will introduce their underlying representations, and functions used to work with and perform calculations on them. In JavaScript, numbers are implemented in double-precision 64-bit binary format IEEE ...
🌐
YoungWonks
youngwonks.com › blog › javascript-string-format
JavaScript String Formatting: A Comprehensive Guide
September 28, 2023 - In this blog, we are going to cover how to write strings in JavaScript, how to concatenate them, and what are the different ways to format strings in JavaScript. We will also discuss the role of placeholders and backticks.
🌐
freeCodeCamp
freecodecamp.org › news › javascript-string-format-how-to-format-strings-in-js
JavaScript String Format – Formatting Strings in JS
July 11, 2022 - By Dillion Megida JavaScript has many string methods you can use to format strings. In this article, I'll show you some of the most commonly used methods. How to Use the toLowerCase() String Method As the name implies, you use the toLowerCase() strin...
🌐
Guru99
guru99.com › home › javascript › javascript string format: methods with examples
JavaScript String Format: Methods with EXAMPLES
July 28, 2025 - For instance, we have now used the “+” operator to concatenate the same variable values, and the “console.log()” method will return a formatted string on the console. ... In your JavaScript program, you can also use the custom function string formatting approach.
🌐
Leapcell
leapcell.io › blog › javascript-string-formatting-alternatives-to-printf
JavaScript String Formatting: Alternatives to `printf()` | Leapcell
July 25, 2025 - function printf(format, ...args) { return format.replace(/{(\d+)}/g, (match, number) => { return typeof args[number] !== 'undefined' ? args[number] : match; }); } console.log(printf("The sum of {0} and {1} is {2}.", 5, 10, 15)); // Output: The sum of 5 and 10 is 15. This function provides flexibility for dynamic string construction. While JavaScript lacks a native printf() function, the combination of template literals, custom formatting functions, and built-in methods like toLocaleString() offers powerful alternatives for string formatting.
Find elsewhere
🌐
npm
npmjs.com › package › string-format
string-format - npm
May 18, 2018 - string-format is a small JavaScript library for formatting strings, based on Python's str.format().
      » npm install string-format
    
Published   May 18, 2018
Version   2.0.0
Author   David Chambers
🌐
Scaler
scaler.com › home › topics › what is javascript string format?
What is JavaScript string format? - Scaler Topics
June 27, 2024 - Strings in JavaScript are defined as a series of characters wrapped within double or single quotes and are indexed from zero. The first character of the string is at index 0, the second at index 1, and so on.
🌐
Flexiple
flexiple.com › javascript › string-format
JavaScript String Format – Formatting Strings in JS - Flexiple
June 6, 2024 - JavaScript string formatting involves manipulating and presenting text in various ways. Developers use string formatting in JavaScript to integrate variables and constants into strings dynamically, making code more readable and maintainable.
🌐
GeeksforGeeks
geeksforgeeks.org › javascript › what-are-the-equivalent-of-printf-string-format-in-javascript
Printf or String.Format in JavaScript - GeeksforGeeks
November 30, 2024 - The printf function and the String.Format() methods are two popular string formatting tools in other programming languages, but JavaScript does not have a built-in equivalent.
🌐
freeCodeCamp
freecodecamp.org › news › javascript-string-format-how-to-use-string-interpolation-in-js
JavaScript String Format – How to use String Interpolation in JS
September 8, 2020 - Anything inside ${} is evaluated as JavaScript. For instance, we could write Earth is estimated to be ${age + 10} billion years old., and it would work as if we did const age = 4.5 + 10;. Before template literals, we would have done it like this: const earthAge = "Earth is estimated to be " + age + " billion years old."; As you can see, we already have lots of quotes for a simple string.
🌐
Flexiple
flexiple.com › javascript › javascript-string-format
Javascript String Format - Flexiple
April 29, 2024 - JavaScript string format refers to the methods and syntax used to manipulate and display strings in JavaScript. This encompasses operations like concatenation, interpolation, and template literals, which enhance the flexibility and readability ...
🌐
Medium
medium.com › @onlinemsr › javascript-string-format-the-best-3-ways-to-do-it-c6a12b4b94ed
JavaScript String Format: The Best 3 Ways To Do It | by Raja MSR | Medium
January 14, 2025 - One of the cleanest and most straightforward methods is to format a string using a template literal or string interpolation. Instead of using a single or double quoted string, we must use the backtick ( ` ) to encapsulate the string in this approach.
🌐
W3Schools
w3schools.com › js › js_string_templates.asp
JavaScript String Templates
Template Strings is an ES6 feature. ES6 is fully supported in all modern browsers since June 2017: ... Complete JavaScript String Reference.
🌐
CoreUI
coreui.io › blog › what-is-javascript-printf-equivalent
JavaScript printf equivalent · CoreUI
June 22, 2024 - To replicate printf functionality, you can create a custom format method. This method uses the replace function with regular expressions to substitute placeholders with arguments. String.prototype.format = function(...args) { return this.replace(/{(\d+)}/g, (match, number) => { return typeof args[number] !== 'undefined' ?
🌐
GitHub
github.com › davidchambers › string-format
GitHub - davidchambers/string-format: JavaScript string formatting inspired by Python’s `str.format()`
string-format is a small JavaScript library for formatting strings, based on Python's str.format().
Starred by 333 users
Forked by 36 users
Languages   JavaScript
Top answer
1 of 16
74

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);
2 of 16
45

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.

🌐
GNU
gnu.org › software › gettext › manual › html_node › javascript_002dformat.html
javascript-format (GNU gettext utilities)
In such a format string, a directive starts with ‘%’ and is finished by a specifier: ‘%’ denotes a literal percent sign, ‘c’ denotes a character, ‘s’ denotes a string, ‘b’, ‘d’, ‘o’, ‘x’, ‘X’ denote an integer, ‘f’ denotes floating-point number, ‘j’ denotes a JSON object.