85

C# has the really powerful String.Format() for replacing elements like {0}with parameters. Does JavaScript have an equivalent?

8
  • 3
    There's no built-in equivalent, but you may google for external libraries. Commented Aug 23, 2013 at 14:48
  • 2
    Another option is CoffeeScript, which has Ruby style string interpolation. Commented Aug 23, 2013 at 14:49
  • a solution that allows for argument formatting, based on actual .net code: stackoverflow.com/questions/2534803/string-format-in-javascript Commented Jan 12, 2015 at 23:11
  • 4
    That's the wrong duplicate. This is a question about string.format in JavaScript, and the dupe is for jQuery. JavaScript !== jQuery. There's not even a jQuery tag. You could argue this question ("JavaScript equivalent to printf/string.format") is the correct "original", but the currently linked one isn't. Commented Jun 10, 2015 at 14:55
  • 2
    We're looking for a non-jQuery answer. How can you mark the jQuery post as a duplicate for this question? That's supremely ignorant on part of those collective users who voted to close this off. Voting to reopen, btw. Commented Jan 5, 2017 at 16:06

4 Answers 4

92

Try sprintf() for javascript.

Or

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

Both answers pulled from JavaScript equivalent to printf/string.format

Sign up to request clarification or add additional context in comments.

4 Comments

a solution that allows for argument formatting, based on actual .net code: stackoverflow.com/questions/2534803/string-format-in-javascript
If you don't want to extend the prototype: export class String { //String.format("{0} comes before {1}", "a", "b") static format(stringToFormat, ...tokens) { return stringToFormat.replace(/{(\d+)}/g, function (match, number) { return typeof tokens[number] != 'undefined' ? tokens[number] : match; }); }; }
Yeah, I think it's a bad practice to extend the prototype of standard objects.
Basically Logic is return stringToFormat.replace(/{(\d+)}/g, function (match, number) { return typeof tokens[number] != 'undefined' ? tokens[number] : match; }); you can put this in normal method just like below : function format(stringToFormat, ...tokens) { return stringToFormat.replace(/{(\d+)}/g, function (match, number) { return typeof tokens[number] != 'undefined' ? tokens[number] : match; }); };
32

I am using:

String.prototype.format = function() { var s = this, i = arguments.length; while (i--) { s = s.replace(new RegExp('\\{' + i + '\\}', 'gm'), arguments[i]); } return s; }; 

usage: "Hello {0}".format("World");

I found it at Equivalent of String.format in JQuery

UPDATED:

In ES6/ES2015 you can use string templating for instance

'use strict'; let firstName = 'John', lastName = 'Smith'; console.log(`Full Name is ${firstName} ${lastName}`); // or console.log(`Full Name is ${firstName + ' ' + lastName}'); 

1 Comment

Although string templating is a nice feature, it's not the same thing. You can't store the string in memory or otherwise (in a registry for example) and use it with whatever inputs at a later point during runtime.
17

Based on @Vlad Bezden answer I use this slightly modified code because I prefer named placeholders:

String.prototype.format = function(placeholders) { var s = this; for(var propertyName in placeholders) { var re = new RegExp('{' + propertyName + '}', 'gm'); s = s.replace(re, placeholders[propertyName]); } return s; }; 

usage:

"{greeting} {who}!".format({greeting: "Hello", who: "world"}) 

String.prototype.format = function(placeholders) { var s = this; for(var propertyName in placeholders) { var re = new RegExp('{' + propertyName + '}', 'gm'); s = s.replace(re, placeholders[propertyName]); } return s; }; $("#result").text("{greeting} {who}!".format({greeting: "Hello", who: "world"}));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div id="result"></div>

1 Comment

Great, much more suitable for formatting when there are multiple variables passed.
16

I created it a long time ago, related question

String.Format = function (b) { var a = arguments; return b.replace(/(\{\{\d\}\}|\{\d\})/g, function (b) { if (b.substring(0, 2) == "{{") return b; var c = parseInt(b.match(/\d/)[0]); return a[c + 1] }) }; 

2 Comments

This seems to be a better answer since it's not messing with the prototype.
Nice, sample usage: String.Format("Hello {0}. The meaning of life is {1} !", 'World', 42);

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.