JavaScript эквивалент функции Python format()?
У Python есть эта красивая функция, чтобы включить это:
bar1 = 'foobar'
bar2 = 'jumped'
bar3 = 'dog'
foo = 'The lazy ' + bar3 + ' ' + bar2 ' over the ' + bar1
# The lazy dog jumped over the foobar
В это:
bar1 = 'foobar'
bar2 = 'jumped'
bar3 = 'dog'
foo = 'The lazy {} {} over the {}'.format(bar3, bar2, bar1)
# The lazy dog jumped over the foobar
Есть ли у такой функции JavaScript? Если нет, как мне создать тот, который следует за тем же синтаксисом, что и реализация Python?
Ответы
Ответ 1
Другой подход, используя метод String.prototype.replace
, с функцией "replacer" в качестве второго аргумента:
String.prototype.format = function () {
var i = 0, args = arguments;
return this.replace(/{}/g, function () {
return typeof args[i] != 'undefined' ? args[i++] : '';
});
};
var bar1 = 'foobar',
bar2 = 'jumped',
bar3 = 'dog';
'The lazy {} {} over the {}'.format(bar3, bar2, bar1);
// "The lazy dog jumped over the foobar"
Ответ 2
Есть способ, но не совсем с использованием формата.
var name = "John";
var age = 19;
var message = 'My name is ${name} and I am ${age} years old';
console.log(message);
Ответ 3
Ищем ответ на тот же вопрос, я просто нашел это: https://github.com/davidchambers/string-format, который является "форматированием строки JavaScript, вдохновленным Pythons str.format()
". Кажется, он почти такой же, как функция python format()
.
Ответ 4
Взято из библиотеки YAHOOs:
YAHOO.Tools.printf = function() {
var num = arguments.length;
var oStr = arguments[0];
for (var i = 1; i < num; i++) {
var pattern = "\\{" + (i-1) + "\\}";
var re = new RegExp(pattern, "g");
oStr = oStr.replace(re, arguments[i]);
}
return oStr;
}
Назовите его так:
bar1 = 'foobar'
bar2 = 'jumped'
bar3 = 'dog'
foo = YAHOO.Tools.printf('The lazy {0} {1} over the {2}', bar3, bar2, bar1);
Ответ 5
Вот моя первая попытка. Не стесняйтесь указывать на недостатки.
Пример: http://jsfiddle.net/wFb2p/5/
String.prototype.format = function() {
var str = this;
var i = 0;
var len = arguments.length;
var matches = str.match(/{}/g);
if( !matches || matches.length !== len ) {
throw "wrong number of arguments";
}
while( i < len ) {
str = str.replace(/{}/, arguments[i] );
i++;
}
return str;
};
РЕДАКТИРОВАТЬ: Сделал это немного более эффективным, исключив вызов .match()
в инструкции while
.
РЕДАКТИРОВАТЬ: Изменено так, что одна и та же ошибка возникает, если вы не передаете никаких аргументов.
Ответ 6
ТЛ; др
foo = (a, b, c) => 'The lazy ${a} ${b} over the ${c}'
Почему одних только строк шаблона недостаточно
Шаблонные строки ES6 предоставляют функцию, очень похожую на формат строки питонов. Тем не менее, вы должны знать переменные, прежде чем создавать строку:
var templateString = 'The lazy ${bar3} ${bar2} over the ${bar1}';
Почему формат?
Python str.format
позволяет вам указать строку, прежде чем вы даже узнаете, какие значения вы хотите подключить к ней, например:
foo = 'The lazy {} {} over the {}'
bar1 = 'foobar'
bar2 = 'jumped'
bar3 = 'dog'
foo.format(bar3, bar2, bar1)
Решение
С помощью функции со стрелкой мы можем элегантно обернуть строку шаблона для дальнейшего использования:
foo = (a, b, c) => 'The lazy ${a} ${b} over the ${c}'
bar1 = 'foobar';
bar2 = 'jumped';
bar3 = 'dog';
foo(bar3, bar2, bar1)
Конечно, это работает и с обычной функцией, но функция стрелки позволяет нам сделать это одной строкой. Обе функции доступны в большинстве браузеров и во время выполнения:
Ответ 7
Этот код позволяет точно указать, какие скобки заменить на какие строки. Скобки не должны быть в том же порядке, что и аргументы, и возможны несколько скобок. Функция формата принимает в качестве параметра массив значений, каждый из которых является одной из скобок "переменных", заменяемой соответствующим значением.
String.prototype.format = function (arguments) {
var this_string = '';
for (var char_pos = 0; char_pos < this.length; char_pos++) {
this_string = this_string + this[char_pos];
}
for (var key in arguments) {
var string_key = '{' + key + '}'
this_string = this_string.replace(new RegExp(string_key, 'g'), arguments[key]);
}
return this_string;
};
'The time is {time} and today is {day}, {day}, {day}. Oh, and did I mention that the time is {time}.'.format({day:'Monday',time:'2:13'});
//'The time is 2:13 and today is Monday, Monday, Monday. Oh, and did I mention that the time is 2:13.'
Ответ 8
JS:
String.prototype.format = function () {
var str = this;
for (var i = 0; i < arguments.length; i++) {
str = str.replace('{' + i + '}', arguments[i]);
}
return str;
}
bar1 = 'foobar';
bar2 = 'jumped';
bar3 = 'dog';
python_format = 'The lazy {2} {1} over the {0}'.format(bar1,bar2,bar3);
document.getElementById("demo").innerHTML = "JavaScript equivalent of Python format() function:<br><span id='python_str'>" + python_format + "</span>";
HTML:
<p id="demo"></p>
CSS
span#python_str {
color: red;
font-style: italic;
}
ВЫВОД:
JavaScript-эквивалент функции Python format():
Ленькая собака перепрыгнула через foobar
DEMO:
jsFiddle
Ответ 9
Усандо Сплит:
String.prototype.format = function (args) {
var text = this
for(var attr in args){
text = text.split('${' + attr + '}').join(args[attr]);
}
return text
};
json = {'who':'Gendry', 'what':'will sit', 'where':'in the Iron Throne'}
text = 'GOT: ${who} ${what} ${where}';
console.log('context: ',json);
console.log('template: ',text);
console.log('formated: ',text.format(json));
Ответ 10
JavaScript не имеет такой функции AFAIK.
Вы можете создать его, изменив объект прототипа класса String, чтобы добавить метод format(), который принимает переменное количество аргументов.
В методе формата вам нужно будет получить значение экземпляра String (фактическая строка), а затем проанализировать его для "{}" и вставить соответствующий аргумент.
Затем верните новую строку вызывающему.
Ответ 11
JavaScript по умолчанию не имеет функции форматирования строк, хотя вы можете создать свой собственный или использовать кого-то другого (например, sprintf)
Ответ 12
В файле
https://github.com/BruceSherwood/glowscript/blob/master/lib/glow/api_misc.js
- это функция String.prototype.format = function (args), которая полностью реализует функцию Python string.format(), не ограничиваясь просто обработкой символьных строк.
Ответ 13
Для тех, кто ищет простое решение ES6.
Прежде всего, я предоставляю функцию вместо расширения собственного прототипа String, потому что это обычно не рекомендуется.
// format function using replace() and recursion
const format = (str, arr) => arr.length > 1
? format(str.replace('{}', arr[0]), arr.slice(1))
: (arr[0] && str.replace('{}', arr[0])) || str
// Example usage
const str1 = 'The {} brown {} jumps over the {} dog'
const formattedString = formatFn(str1, ['quick','fox','lazy'])
console.log(formattedString)