Те, кто пишут на C# очень хорошо знают и часто используют механизм String.Format, которого сильно не хватает в JavaScript. Несмотря на его простоту и удобство, на просторах Сети мало что можно накопать, в основном вариации на тему sprintf (привет сишникам). Достаточно давно был написан скрипт, который позволял форматировать строки на JavaScript и был похож на String.Format C#. Форматирование стало использоваться коллегами достаточно плотно в скриптах и я решил немного причесать код и опубликовать для тех, кто хочет получить String.Format в JavaScript.
Использовать можно 2-мя способами:
1. Как в C#:
2. Как функция у любой строки:
Все функции форматирования получают 2 параметры: значение, которое нужно отформатировать и массив параметров. Вот так рекомендуется регистрировать функции форматирования:
В скрипте уже встроены функции форматирования для чисел, массивов и дат.
i — количество разрядов для целой части, если в целой части больше разрадов, то они остаются на месте, если меньше — в начале будет вставлено нужное число нулей.
f — количество разрядов для дробной части, лишние числа будут отброшены.
Параметры можно пропускать: {0:n(,2)} — вывести число с 2-мя знаками в десятичной части.
Собственно все есть тут: полное описание встроенных форматов, тестовый скрипт, исходники и упакованная версия
Скрипт для работы не требует никаких дополнительных библиотек и разбит на 3 части:
Для уменьшения скрипта можно удалить оттуда вторую и(или) третью части.
В исходнике достаточно комментариев, что бы понять, как он работает.

Итак, основные возможности:
- Маркеры как в C#:
{0}
- Можно задавать используемую функцию форматирования:
{0:d}
- Можно передавать параметры функции форматирования:
{0:n(,2)}
- Можно регистрировать свои функции форматирования
- Небольшой размер — 3.5Кб в упакованном виде
- Работает быстро
- Работает в IE, Chrome, Firefox (проверено), теоретически ничего не мешает работать в серверном JavaScript
- Уже реализованы и встроены функции форматирования:
- Форматирование массивов
- Форматирование чисел
- Форматирование даты и времени
Использование
Использовать можно 2-мя способами:
1. Как в C#:
var s = String.Format(format, arg0[, arg1[, arg2[...]]]);
2. Как функция у любой строки:
var s = 'format string {0}'.format(arg0[, arg1[, arg2[...]]]);
Правила для маркеров
{0}
— значение будет преобразовано в строку по правилам JavaScript{0:f}
— значение будет преобразовано в строку с помощью функции, зарегистрированной под именем f{0:f(p1,p2)}
— значение будет преобразовано в строку с помощью функции, зарегистрированной под именем f и этой функции будут переданы параметры p1 и p2 в массиве, количество и правила для параметров зависят от самой функции, однако есть несколько общих правил:- Параметры разделяются запятыми
- Все знаки в круглых скобках значимы т.е. для
{0:f(p1,p2)}
будет передано ['p1', 'p2'], а в случае{0:f(p1, p2)}
будет передано ['p1', ' p2'] - Для маскирования запятой и закрывающей круглой скобки нужно использовать слэш:
{0:f(p1\, p2)}
будет передано ['p1, p2'] - Параметры можно пропускать: для
{0:f(,p2)}
будет передано ['', 'p2'] - Можно использовать вложенные маркеры: для
{0:f({1})}
будет передано ['значение_из_параметра_с_индексом_1'], в этом случае форматирование недопустимо, а значение передается то же, что было передано функции format
Функции форматирования
Все функции форматирования получают 2 параметры: значение, которое нужно отформатировать и массив параметров. Вот так рекомендуется регистрировать функции форматирования:
(function(format)<br/>{<br/> // Регистрация функции форматирования<br/> // name - имя для использования в маркерах<br/> // v - значение для форматирования, в функцию будет передано так же, как его передали в функцию format<br/> // params - массив параметров, всегда есть, но межет быть нулевого размера<br/> // Функция обязана вернуть строку, которая будет подставлена вместо метки<br/> format.add(name, function(v, params)<br/> {<br/> return ...;<br/> });<br/>})(String.prototype.format);
Встроенные функции форматирования
В скрипте уже встроены функции форматирования для чисел, массивов и дат.
{0:n}
— форматирование числа, если в функцию пришло не число, то будет выведено NaN. Вид чисел 1.11111111e+20 будет преобразован в нормальный: 111111111000000000000. Можно передавать строки с числом: '1.67' или '123.456e+2' — будет вставлено соответственно 1.67 и 12345.6.{0:n([i][,f])}
— форматирование числа с заполнением нулями до нужного числа разрядов.i — количество разрядов для целой части, если в целой части больше разрадов, то они остаются на месте, если меньше — в начале будет вставлено нужное число нулей.
f — количество разрядов для дробной части, лишние числа будут отброшены.
Параметры можно пропускать: {0:n(,2)} — вывести число с 2-мя знаками в десятичной части.
{0:df([f])}
— произвольное форматирование даты, f — строка формата с подстановками, возможные подстановки:- yy или yyyy — Год, всегда выводится 4 знака.
- M или MM — Месяц, 1 или 2 знака
- d или dd — День, 1 или 2 знака
- H или HH — Часы, 1 или 2 знака в 24-часовом формате
- m или mm — Минуты, 1 или 2 знака
- s или ss — Секунды, 1 или 2 знака
- f...ffff — Миллисекунды, от 1 до 4 знаков
Более полная документация, где скачать скрипт
Собственно все есть тут: полное описание встроенных форматов, тестовый скрипт, исходники и упакованная версия
Скрипт для работы не требует никаких дополнительных библиотек и разбит на 3 части:
- Собственно реализация основного кода форматирования
- Форматирование чисел
- Форматирование даты/времени
Для уменьшения скрипта можно удалить оттуда вторую и(или) третью части.
В исходнике достаточно комментариев, что бы понять, как он работает.
