Pull to refresh

String.Format

Reading time3 min
Views70K
Те, кто пишут на C# очень хорошо знают и часто используют механизм String.Format, которого сильно не хватает в JavaScript. Несмотря на его простоту и удобство, на просторах Сети мало что можно накопать, в основном вариации на тему sprintf (привет сишникам). Достаточно давно был написан скрипт, который позволял форматировать строки на JavaScript и был похож на String.Format C#. Форматирование стало использоваться коллегами достаточно плотно в скриптах и я решил немного причесать код и опубликовать для тех, кто хочет получить String.Format в JavaScript.

Итак, основные возможности:


  • Маркеры как в 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 в массиве, количество и правила для параметров зависят от самой функции, однако есть несколько общих правил:
  1. Параметры разделяются запятыми
  2. Все знаки в круглых скобках значимы т.е. для {0:f(p1,p2)} будет передано ['p1', 'p2'], а в случае {0:f(p1, p2)} будет передано ['p1', ' p2']
  3. Для маскирования запятой и закрывающей круглой скобки нужно использовать слэш: {0:f(p1\, p2)} будет передано ['p1, p2']
  4. Параметры можно пропускать: для {0:f(,p2)} будет передано ['', 'p2']
  5. Можно использовать вложенные маркеры: для {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 части:
  1. Собственно реализация основного кода форматирования
  2. Форматирование чисел
  3. Форматирование даты/времени

Для уменьшения скрипта можно удалить оттуда вторую и(или) третью части.
В исходнике достаточно комментариев, что бы понять, как он работает.
Весь код раскрашен с помощью DmSyntax
Tags:
Hubs:
+28
Comments18

Articles