Muitas das funções acima (exceto as de Julian Jelfs) contêm o seguinte erro:
js> '{0} {0} {1} {2}'.format(3.14, 'a{2}bc', 'foo');
3.14 3.14 afoobc foo
Ou, para as variantes que contam de trás para frente no final da lista de argumentos:
js> '{0} {0} {1} {2}'.format(3.14, 'a{0}bc', 'foo');
3.14 3.14 a3.14bc foo
Aqui está uma função correta. É uma variante prototípica do código de Julian Jelfs, que eu fiz um pouco mais:
String.prototype.format = function () {
var args = arguments;
return this.replace(/\{(\d+)\}/g, function (m, n) { return args[n]; });
};
E aqui está uma versão um pouco mais avançada do mesmo, que permite escapar dos aparelhos dobrando-os:
String.prototype.format = function () {
var args = arguments;
return this.replace(/\{\{|\}\}|\{(\d+)\}/g, function (m, n) {
if (m == "{{") { return "{"; }
if (m == "}}") { return "}"; }
return args[n];
});
};
Isso funciona corretamente:
js> '{0} {{0}} {{{0}}} {1} {2}'.format(3.14, 'a{2}bc', 'foo');
3.14 {0} {3.14} a{2}bc foo
Aqui está outra boa implementação de Blair Mitchelmore, com vários recursos extras agradáveis: https://web.archive.org/web/20120315214858/http://blairmitchelmore.com/javascript/string.format