Я ищу хороший JavaScript-эквивалент C / PHP printf()
или программистов на C # / Java String.Format()
( IFormatProvider
для .NET).
Моим основным требованием является формат разделителя тысяч для чисел на данный момент, но что-то, что обрабатывает множество комбинаций (включая даты), было бы хорошо.
Я понимаю, что библиотека Ajax от Microsoft предоставляет версию String.Format()
, но нам не нужны все издержки этой инфраструктуры.
javascript
printf
string.format
Chris S
источник
источник
Ответы:
Начиная с ES6 вы можете использовать шаблоны строк:
Смотрите ответ Ким ниже для деталей.
В противном случае:
Попробуйте sprintf () для JavaScript .
Если вы действительно хотите сделать простой метод форматирования самостоятельно, не делайте замены последовательно, а выполняйте их одновременно.
Поскольку большинство других упомянутых предложений терпят неудачу, когда строка замены предыдущей замены также содержит последовательность формата, подобную этой:
Обычно вы ожидаете, что результат будет,
{1}{0}
но фактический результат есть{1}{1}
. Так что сделайте одновременно замену, как в предложении страха .источник
num.toFixed()
метода может быть достаточно!sprintf() for JavaScript
не было доступно.underscore.string
имеет больше возможностей, кроме sprintf, который основан наsprintf() for JavaScript
реализации. Кроме того, библиотека - это совершенно другой проект.Опираясь на ранее предложенные решения:
"{0} is dead, but {1} is alive! {0} {2}".format("ASP", "ASP.NET")
выходы
Если вы предпочитаете не изменять
String
прототип:Дает вам гораздо более знакомые:
String.format('{0} is dead, but {1} is alive! {0} {2}', 'ASP', 'ASP.NET');
с тем же результатом:
источник
+
оператора -o), обязательно поставьте полную строку в скобки: в("asd {0}"+"fas {1}").format("first", "second");
противном случае функция будет применена только к последней добавленной строке.'foo {0}'.format(fnWithNoReturnValue())
. В настоящее время он вернетсяfoo {0}
. С вашими изменениями он вернетсяfoo undefined
.Забавно, потому что Stack Overflow на самом деле имеет свою собственную функцию форматирования для
String
прототипаformatUnicorn
. Попробуй это! Зайдите в консоль и наберите что-то вроде:Вы получаете этот вывод:
Hello, Gabriel, are you feeling OK?
Вы можете использовать объекты, массивы и строки в качестве аргументов! Я получил его код и переработал его для создания новой версии
String.prototype.format
:Обратите внимание на умных
Array.prototype.slice.call(arguments)
вызов - это означает, что если вы добавите аргументы, которые являются строками или числами, а не одним объектом в стиле JSON, выString.Format
почти точно получите поведение C # .Это потому , что
Array
«сslice
заставит все , это вarguments
вArray
, был ли он изначально или нет, иkey
будет индекс (0, 1, 2 ...) каждый элемент массива принуждается в строку (например,„0“, так"\\{0\\}"
для вашего первого шаблона регулярных выражений).Ухоженная.
источник
g
), который может заменить один и тот же ключ более одного раза. В приведенном выше примере вы можете использовать{name}
несколько раз в одном предложении и заменить их все.name
есть"blah {adjective} blah"
?Форматирование чисел в JavaScript
Я попал на страницу с вопросом в надежде найти способ форматирования чисел в JavaScript, не представляя еще одну библиотеку. Вот что я нашел:
Округление чисел с плавающей точкой
sprintf("%.2f", num)
Кажетсяnum.toFixed(2)
, что эквивалент в JavaScript , который форматируетnum
до 2 десятичных разрядов, с округлением (но см. Комментарий @ ars265Math.round
ниже).Экспоненциальная форма
Эквивалентом
sprintf("%.2e", num)
являетсяnum.toExponential(2)
.Шестнадцатеричные и другие базы
Чтобы напечатать числа в базе B, попробуйте
num.toString(B)
. JavaScript поддерживает автоматическое преобразование в и из баз со 2 по 36 (кроме того, некоторые браузеры имеют ограниченную поддержку кодировки base64 ).Справочные страницы
Краткое руководство по форматированию номеров JS
Справочная страница Mozilla для toFixed () (со ссылками на toPrecision (), toExponential (), toLocaleString (), ...)
источник
..
также работает:33333..toExponential(2);
Начиная с ES6 вы можете использовать шаблоны строк :
Имейте в виду, что строки шаблона заключаются в обратные кавычки `вместо (одинарных) кавычек.
Для дополнительной информации:
https://developers.google.com/web/updates/2015/01/ES6-Template-Strings
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/template_strings
Примечание. Проверьте сайт mozilla, чтобы найти список поддерживаемых браузеров.
источник
const compile = (x, y) => `I can call this template string whenever I want.. x=${x}, y=${y}`
...compile(30, 20)
JSXT, Zippo
Этот вариант подходит лучше.
С помощью этой опции я могу заменить строки следующим образом:
С вашим кодом вторая {0} не будет заменена. ;)
источник
Я использую эту простую функцию:
Это очень похоже на string.format:
источник
+=
? Должно ли этоformatted = this.replace("{" + arg + "}", arguments[arg]);
for...in
не будет работать в каждом браузере, как этого ожидает код. Он будет перебирать все перечисляемые свойства, которые в некоторых браузерах будут включеныarguments.length
, а в других вообще не будут включать сами аргументы. В любом случае, еслиObject.prototype
он добавлен, любые дополнения, вероятно, будут включены в группу. Код должен использовать стандартныйfor
цикл, а неfor...in
."{0} is dead, but {1} is alive!".format("{1}", "ASP.NET") === "ASP.NET is dead, but ASP.NET is alive!"
arg
является глобальной. Вы должны сделать это вместо этого:for (var arg in arguments) {
Для пользователей Node.js есть
util.format
функция, аналогичная printf:источник
%-20s %5.2f
)Я удивлен, что никто не использовал
reduce
, это родная краткая и мощная функция JavaScript.ES6 (EcmaScript2015)
<ES6
Как это работает:
источник
printf
функции: jsfiddle.net/11szrbx9(...a) => {return a.reduce((p: string, c: any) => p.replace(/%s/, c));
String.prototype.format
в ES6:((a,b,c)=>`${a}, ${b} and ${c}`)(...['me', 'myself', 'I'])
(обратите внимание, что это немного избыточно, чтобы лучше соответствовать вашему примеру)printf
спецификаторов типов и включить логику для префиксов заполнения. Похоже, что перебор строки формата в разумной манере является второстепенной задачей, imho. Оптимальное решение, если вам нужны только замены строк.Вот минимальная реализация sprintf в JavaScript: он выполняет только «% s» и «% d», но я оставил место для его расширения. Это бесполезно для ОП, но другие люди, которые натыкаются на эту ветку из Google, могут извлечь из этого пользу.
Пример:
В отличие от аналогичных решений в предыдущих ответах, этот выполняет все замены за один раз , поэтому он не заменит части ранее замененных значений.
источник
Программисты JavaScript могут использовать String.prototype.sprintf по адресу https://github.com/ildar-shaimordanov/jsxt/blob/master/js/String.js . Ниже приведен пример:
источник
Добавление к
zippoxer
ответу, я использую эту функцию:У меня также есть не прототипная версия, которую я использую чаще для ее Java-подобного синтаксиса:
ES 2015 обновление
Все классные новинки ES 2015 делают это намного проще:
Я подумал, что, поскольку это, как и старые, на самом деле не анализирует буквы, оно может просто использовать один токен
%%
. Преимущество этого состоит в том, что он очевиден и не затрудняет использование одного%
. Однако, если вам нужно%%
по какой-то причине, вам нужно заменить его на себя:источник
+1 Zippo за исключением того, что тело функции должно быть таким, как показано ниже, или иначе оно добавляет текущую строку на каждую итерацию:
источник
'The {0} is dead. Don\'t code {0}. Code {1} that is open source!'.format('ASP', 'PHP');
результатом становитсяThe ASP is dead. Don't code {0}. Code PHP that is open source!
. Еще одна вещьfor(arg in arguments)
не работает в IE. я заменил наfor (arg = 0; arg <arguments.length; arg++)
for...in
не будет работать в каждом браузере, как этого ожидает код. Он будет перебирать все перечисляемые свойства, которые в некоторых браузерах будут включеныarguments.length
, а в других вообще не будут включать сами аргументы. В любом случае, еслиObject.prototype
он добавлен, любые дополнения, вероятно, будут включены в группу. Код должен использовать стандартныйfor
цикл, а неfor...in
.Я хочу поделиться своим решением для «проблемы». Я не изобрел колесо заново, но пытаюсь найти решение, основанное на том, что JavaScript уже делает. Преимущество в том, что вы получаете все неявные преобразования бесплатно. Установка свойства prototype $ для String дает очень красивый и компактный синтаксис (см. Примеры ниже). Это, возможно, не самый эффективный способ, но в большинстве случаев, когда дело доходит до выхода, его не нужно супероптимизировать.
Вот несколько примеров:
источник
Я добавлю свои собственные открытия, которые я нашел, так как я спросил:
К сожалению, кажется, что sprintf не обрабатывает тысячи разделителей форматирования, как формат строки .NET.
источник
Я использую небольшую библиотеку под названием String.format для JavaScript, которая поддерживает большинство возможностей форматирования строк (включая формат чисел и дат) и использует синтаксис .NET. Сам скрипт меньше 4 кБ, поэтому он не создает больших накладных расходов.
источник
Очень элегантно:
Кредит идет в
(неработающей ссылке)https://gist.github.com/0i0/1519811источник
{{0}}
а также такие вещи, как{0}{1}.format("{1}", "{0}")
. Должно быть на самой вершине!Если вы хотите обработать разделитель тысяч, вам действительно следует использовать toLocaleString () из класса JavaScript Number, так как он отформатирует строку для региона пользователя.
Класс JavaScript Date может форматировать локализованные даты и время.
источник
Проект PHPJS написал реализации JavaScript для многих функций PHP. Поскольку
sprintf()
функции PHP в основном совпадают с функциями Cprintf()
, их реализация на JavaScript должна удовлетворить ваши потребности.источник
Я использую это:
Тогда я называю это:
источник
У меня есть решение, очень близкое к решению Питера, но оно касается числа и случая объекта.
Возможно, может быть даже лучше иметь дело со всеми случаями глубины, но для моих нужд это просто отлично.
PS: эта функция очень полезна, если вы используете переводы в шаблонах, таких как AngularJS :
Где en.json что-то вроде
источник
Одна версия, немного отличающаяся от той, которую я предпочитаю (в ней используются токены {xxx}, а не аргументы с нумерацией {0}, это намного больше самодокументируется и лучше подходит для локализации):
Вариация будет:
который сначала вызывает функцию локализации l ().
источник
Для JavaScript есть «sprintf», который вы можете найти по адресу http://www.webtoolkit.info/javascript-sprintf.html .
источник
Для тех, кто любит Node.JS и его
util.format
возможности, я только что извлек его в свою ванильную форму JavaScript (только с функциями, которые использует util.format):Собран из: https://github.com/joyent/node/blob/master/lib/util.js
источник
Для базового форматирования:
источник
У меня есть немного больше форматера для JavaScript здесь ...
Вы можете сделать форматирование несколькими способами:
String.format(input, args0, arg1, ...)
String.format(input, obj)
"literal".format(arg0, arg1, ...)
"literal".format(obj)
Кроме того, если вы говорите ObjectBase.prototype.format (например, с DateJS ), он будет использовать это.
Примеры...
Я также связался с .asFormat и у меня есть определенное место на случай, если уже есть string.format (например, с MS Ajax Toolkit (я ненавижу эту библиотеку).
источник
На всякий случай, если кому-то нужна функция для предотвращения загрязнения глобальной области, вот функция, которая делает то же самое:
источник
Мы можем использовать простую облегченную библиотеку строковых операций String.Format для Typescript.
String.Format ():
Формат строки для спецификаторов:
Формат строки для объектов, включая спецификаторы:
источник
Я не видел
String.format
вариант:источник
Для использования с функциями успеха jQuery.ajax (). Передайте только один аргумент и строку замените свойствами этого объекта как {propertyName}:
Пример:
источник