Simple String.format() in javascript
String.prototype.format = function() {
a = this;
for (k in arguments) {
a = a.replace("{" + k + "}", arguments[k])
}
return a
}
Usage:
console.log("Hello, {0}!".format("World"))Written by Sergey Avseyev
Related protips
4 Responses
Thanks! I made a small improvement so that all instances are replaced rather than just the first. :)
String.prototype.format = function () {
var a = this;
for (var k in arguments) {
a = a.replace(new RegExp("\\{" + k + "\\}", 'g'), arguments[k]);
}
return a
}This doesn't change the problem of backward compatibility, but string literals are coming to JS:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals
You might wish to amend your prototyping to match the functionality.
One thing to note is that it uses the ` string limiter rather than the single or double quotes ' "
Simple is nice, but it has its drawbacks.
console.log("{0} {1}".format("{1}", 42)) //oddly, prints "42 42"
//not sure how I would print "{0}" within the string without escaping...
Here's an implementation that validates the format string and allows escaping. I also prefer a free function over extending builtin types.
function format(fmt, ...args) {
if (!fmt.match(/^(?:(?:(?:[^{}]|(?:\{\{)|(?:\}\}))+)|(?:\{[0-9]+\}))+$/)) {
throw new Error('invalid format string.');
}
return fmt.replace(/((?:[^{}]|(?:\{\{)|(?:\}\}))+)|(?:\{([0-9]+)\})/g, (m, str, index) => {
if (str) {
return str.replace(/(?:{{)|(?:}})/g, m => m[0]);
} else {
if (index >= args.length) {
throw new Error('argument index is out of range in format');
}
return args[index];
}
});
}
function print(fmt, ...args) {
console.log(format(fmt, ...args));
}
print("Hello, {0}! The answer is {1}.", "World", 42);
print("{0} {1}", "{1}", 42);
print("{{0}} will be replaced with {0}", 42);
print("{0}} woops, throw!")Thanks, your post really helped me!
Have a fresh tip? Share with Coderwall community!
JavaScript on a page runs with the privileges of that origin. One altered library, tag manager, or snippet can read inputs, change what people see, and call your APIs as the user.
Security insights from Cside