10

I would like a javascript function that mimics the python .format() function that works like

.format(*args, **kwargs) 

A previous question gives a possible (but not complete) solution for '.format(*args)

JavaScript equivalent to printf/string.format

I would like to be able to do

"hello {} and {}".format("you", "bob" ==> hello you and bob "hello {0} and {1}".format("you", "bob") ==> hello you and bob "hello {0} and {1} and {a}".format("you", "bob",a="mary") ==> hello you and bob and mary "hello {0} and {1} and {a} and {2}".format("you", "bob","jill",a="mary") ==> hello you and bob and mary and jill 

I realize that's a tall order, but maybe somewhere out there is a complete (or at least partial) solution that includes keyword arguments as well.

Oh, and I hear AJAX and JQuery possibly have methods for this, but I would like to be able to do it without all that overhead.

In particular, I would like to be able to use it with a script for a google doc.

Thanks

4
  • Hmm interested about the answer of this one, following. Commented Nov 30, 2012 at 5:20
  • There is nothing built-in, although it's trivial to implement (for some, but not all as JavaScript does not have "named arguments" and specifying an index manual isn't the same, cases presented). Search for "javascript printf" for some leads. Commented Nov 30, 2012 at 5:22
  • I don't believe Javascript has anything like this by default. You might be better off trying a Javascript framework or library. If you think it's too much overhead, Google around for "Javascript string formatting" and you might find something you like. Commented Nov 30, 2012 at 5:26
  • You might like gist.github.com/1049426 but you can find dozens more just like it. Happy searching. Commented Nov 30, 2012 at 5:36

2 Answers 2

15

UPDATE: If you're using ES6, template strings work very similarly to String.format: https://developers.google.com/web/updates/2015/01/ES6-Template-Strings

If not, the below works for all the cases above, with a very similar syntax to python's String.format method. Test cases below.

String.prototype.format = function() { var args = arguments; this.unkeyed_index = 0; return this.replace(/\{(\w*)\}/g, function(match, key) { if (key === '') { key = this.unkeyed_index; this.unkeyed_index++ } if (key == +key) { return args[key] !== 'undefined' ? args[key] : match; } else { for (var i = 0; i < args.length; i++) { if (typeof args[i] === 'object' && typeof args[i][key] !== 'undefined') { return args[i][key]; } } return match; } }.bind(this)); }; // Run some tests $('#tests') .append( "hello {} and {}<br />".format("you", "bob") ) .append( "hello {0} and {1}<br />".format("you", "bob") ) .append( "hello {0} and {1} and {a}<br />".format("you", "bob", {a:"mary"}) ) .append( "hello {0} and {1} and {a} and {2}<br />".format("you", "bob", "jill", {a:"mary"}) );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div id="tests"></div>

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

4 Comments

It enough to use \d instead of \w ?
Unfortunately, no. He has mixed alpha and numeric keys.
Sorry about the delay. YES. It worked just as you said. Very well done. I do not yet know how to do OO in JavaScript, so this will be a great example for me to suss out.
Updated with smart JS snippet.
2

This should work similar to python's format but with an object with named keys, it could be numbers as well.

String.prototype.format = function( params ) { return this.replace( /\{(\w+)\}/g, function( a,b ) { return params[ b ]; } ); }; console.log( "hello {a} and {b}.".format( { a: 'foo', b: 'baz' } ) ); //^= "hello foo and baz." 

6 Comments

[^}]+ is better? it won't workwith print( "hello {a-b} and {b}.".format( { 'a-b': 'foo', b: 'baz' } ) );
I confused that you write generic usage of function. But it's not answer. Do not mind.
@mattn: I don't understand, what do you mean by generic?
I confused that you wrote format function that acceptable all possible words (without {})
underrated answer
|

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.