C# has the really powerful String.Format() for replacing elements like {0}with parameters. Does JavaScript have an equivalent?
4 Answers
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
4 Comments
JasonS
a solution that allows for argument formatting, based on actual .net code: stackoverflow.com/questions/2534803/string-format-in-javascript
miraco
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; }); }; }wm1sr
Yeah, I think it's a bad practice to extend the prototype of standard objects.
Vinod Poorma
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; }); }; 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
Mike Haas
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.
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
Ctrl-C
Great, much more suitable for formatting when there are multiple variables passed.
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] }) };
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.