Многие из вышеперечисленных функций (кроме функций Джулиана Джелфса) содержат следующую ошибку:
js> '{0} {0} {1} {2}'.format(3.14, 'a{2}bc', 'foo');
3.14 3.14 afoobc foo
Или для вариантов, которые отсчитываются в обратном направлении от конца списка аргументов:
js> '{0} {0} {1} {2}'.format(3.14, 'a{0}bc', 'foo');
3.14 3.14 a3.14bc foo
Вот правильная функция. Это прототипный вариант кода Джулиана Джелфса, который я немного сжал:
String.prototype.format = function () {
var args = arguments;
return this.replace(/\{(\d+)\}/g, function (m, n) { return args[n]; });
};
А вот немного более продвинутая версия, которая позволяет вам избегать скобок, удваивая их:
String.prototype.format = function () {
var args = arguments;
return this.replace(/\{\{|\}\}|\{(\d+)\}/g, function (m, n) {
if (m == "{{") { return "{"; }
if (m == "}}") { return "}"; }
return args[n];
});
};
Это работает правильно:
js> '{0} {{0}} {{{0}}} {1} {2}'.format(3.14, 'a{2}bc', 'foo');
3.14 {0} {3.14} a{2}bc foo
Вот еще одна хорошая реализация Блэра Митчелмора с кучей приятных дополнительных функций: https://web.archive.org/web/20120315214858/http://blairmitchelmore.com/javascript/string.format