La plupart des fonctions ci-dessus (à l'exception de Julian Jelfs) contiennent l'erreur suivante:
js> '{0} {0} {1} {2}'.format(3.14, 'a{2}bc', 'foo');
3.14 3.14 afoobc foo
Ou, pour les variantes qui comptent à rebours à partir de la fin de la liste d'arguments:
js> '{0} {0} {1} {2}'.format(3.14, 'a{0}bc', 'foo');
3.14 3.14 a3.14bc foo
Voici une fonction correcte. C'est une variante prototypique du code de Julian Jelfs, que j'ai rendu un peu plus serré:
String.prototype.format = function () {
var args = arguments;
return this.replace(/\{(\d+)\}/g, function (m, n) { return args[n]; });
};
Et voici une version légèrement plus avancée de la même chose, qui vous permet d'échapper aux accolades en les doublant:
String.prototype.format = function () {
var args = arguments;
return this.replace(/\{\{|\}\}|\{(\d+)\}/g, function (m, n) {
if (m == "{{") { return "{"; }
if (m == "}}") { return "}"; }
return args[n];
});
};
Cela fonctionne correctement:
js> '{0} {{0}} {{{0}}} {1} {2}'.format(3.14, 'a{2}bc', 'foo');
3.14 {0} {3.14} a{2}bc foo
Voici une autre bonne mise en œuvre par Blair Mitchelmore, avec un tas de fonctionnalités supplémentaires intéressantes: https://web.archive.org/web/20120315214858/http://blairmitchelmore.com/javascript/string.format