JavaScript аналог String.Format C#
Что тут есть?
Те, кто пишут на C# очень хорошо знают и часто используют механизм String.Format, которого им сильно не хватает в JavaScript.
Для облегчения жизни и был сделан этот небольшой скрипт - реализация String.Format для JavaScript. Естественно реализация один-к-одному
крайне затруднительна и есть некоторые несовместимости, однако реализованный функционал позволяет делать достаточно удобные вещи.
Основные возможности:
- Маркеры как в C#:
{0}
- Можно задавать используемую функцию форматирования:
{0:d}
- Можно передавать параметры функции форматирования:
{0:n(,2)}
- Можно регистрировать свои фунции форматирования
- Два варианта вызова:
- Как в C#:
var s = String.Format(format, arg0[, arg1[, arg2[...]]]);
- Как метод у объекта String:
var s = 'format string {0}'.format(arg0[, arg1[, arg2[...]]]);
- Уже реализованы и встроены функции форматирования:
- Форматирование массовов
- Форматирование чисел
- Форматирование даты и времени
Попробовать прямо сейчас
(
function(format)
{
// Регистрация функции форматирования, подробности ниже.
format.
add(
'my',
function(v, params)
{
});
})(String.prototype.format);
$(
'#trybtn').
click(
function()
{
$(
'#tryresult').
text(
String.
Format(
'',
)
);
});
/* После нажатия на кнопку Try результат будет тут:
*/
QUnit тесты
Как использовать, регистрировать свои функции форматирования и получать существующие
Как было сказано ранее, есть 2 варианта использования:
- Как в C#:
var s = String.Format(format, arg0[, arg1[, arg2[...]]]);
- Как метод у объекта String:
var s = 'format string {0}'.format(arg0[, arg1[, arg2[...]]]);
Описание встроенных форматов
Формат | Описание |
{0} | Вставка значения, приведенное к строке стандартным для JavaScript образом. |
{0,xx} | Дополнить пробелами строку слева от значения до указанного количества символов. |
{0,-xx} | Дополнить пробелами строку справа от значения до указанного количества символов. |
{0:arr} | Вывод элементов массива - аналог [...].join('') |
{0:arr(j)} | Вывод элементов массива через указанный разделитель j - аналог [...].join(j) |
{0:arr(j, f[, fp1[, fp2[...]]])} |
Вывод элементов массива через указанный разделитель j с применением к каждому элементу функции
форматирования f, дополнительно можно передать параметры [, fp1[, fp2[...]]] для функции f,
набор параметров зависит от функции. |
Форматирование чисел |
{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:nb(b)} | Вставка значения числа с указанным основанием b, где b от 2 до 32: 2 - в двоичной системе, 16 - HEX и т.д. |
{0:nb(b,l)} | Тоже самое, что и {0:nb(b)} с дополнением нулями слева до указанного числа разрядов l. |
{0:nf(ln,f1[,f2[...]])} |
Применяется для вывода валют и т.п., зависещее от числа: 1 рубль, 2 рубля, 5 рублей.
ln - имя локали (встроены 2: en и ru)
f1[,f2[...]] - варианты, количество зависит от локали: для en - 2 значения, для ru - 3.
Можно регистрировать собственные функции:
(function(nf)
{
nf.add('my', function(v, params)
{
// v гарантированно будет числом
// В params[0] будет строка 'my'
return v==1?params[1]:params[2];
}
})(String.prototype.format.get('nf')); |
Форматирование даты и времени |
{0:df} | Вставка значения даты, у даты будет сделано toString() |
{0:df(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 знаков |
|
{0:d} | Аналог {0:df(dd.MM.yyyy)} |
{0:dt} | Аналог {0:df(dd.MM.yyyy HH:mm:ss)} |
{0:dt(nosec)} | Аналог {0:df(dd.MM.yyyy HH:mm)} |
{0:t} | Аналог {0:df(HH:mm:ss)} |
{0:t(nosec)} | Аналог {0:df(HH:mm)} |
{0:ts} | Вывод числа миллисекунд или объекта даты в виде '1 дн. 2 час. 3 мин. 4 сек. 5 мс' ,
нулевые значения будут пропущены. |
{0:ts(h|min|sec|msec)} |
Тоже, что и {0:ts}, только с указанием точности:
- msec - до миллисекунд (по-умолчанию)
- sec - до секунд
- min - до минут
- h - до часов
|
Получение зарегистрированных функций форматирования
(function(format)
{
var f = format.get('df'); // Получаем функцию форматирования даты/времени
alert(f(new Date(), ['yyyy-MM-dd HH/mm/ss/ffff'])); // Используем по своему усмотрению
})(String.prototype.format);
Настройка функций форматирования
11.06.2010 10:16:40 мне написали:
Локаль: String.Format не распознает русский децимальный разделитель ",". Если писать веб-формы для автоматизации, то это было-бы полезно. Конечно, можно конвертировать перед этим, но... :)
Спасибо огромние за идею, я добавил возможность поменять настройки форматирования, делается это следующим образом:
(function(format)
{
format.init({
n: { // Настройки для форматирования чисел:
dseparator: '.', // - разделитель целой и дробной части
nan: 'NaN' // - текст, выводимый при попытке отформатировать не число
},
df: { // Настройки для форматирования даты+времени:
nad: 'NaD', // - текст, выводимый при попытке отформатировать не объект даты
d: 'dd.MM.yyyy', // - формат для :d
dts: 'dd.MM.yyyy HH:mm:ss', // - формат для :dts
dt: 'dd.MM.yyyy HH:mm', // - формат для :dt
ts: 'HH:mm:ss', // - формат для :ts
t: 'HH:mm' // - формат для :t
},
ts: { // Настройки для форматирования времени счетчика:
d: 'дн.', // - обозначение дней
h: 'час.', // - обозначение часов
m: 'мин.', // - обозначение минут
s: 'сек.', // - обозначение секунд
ms: 'мс' // - обозначение миллисекунд
}
});
format.init({ n: { }, df: { }, ts: { } }); // Сброс настроек
})(String.prototype.format);
Настройки можно указывать не полностью, тогда для пропущенных параметров будут использоваться значения по-умолчанию. Настройки для разных
функций форматирования можно указывать независимо:
(function(format)
{
format.init({
n: {
dseparator: ',' // Разделитель целой и дробной части теперь будет запятой, а настройка nan будет по-умолчанию = 'NaN'
}
});
format.init({ // Этот вызов никаким образом не затронет настройку для формата n
df: {
nad: '!Date' // Изменен параметр nad, а все остальные будут = значениям по-умолчанию
}
});
format.init({ n: { } }); // Сброс настроек повлияет только на формат n
})(String.prototype.format);
Регистрация своей функции форматирования
(function(format)
{
// Регистрация функции форматирования, использовать можно так: '{0:my(p1,p2,p3)}'.format(v)
// v - значение для ворматирования, в функцию будет передано так же, как его передали в функцию format
// params - массив параметров, всегда есть, но межет быть нулевого размера
// Функция обязана вернуть строку, которая будет подставлена вместо метки
format.add('my', function(v, params)
{
return '{'.concat(v, ':my(', params.join(','), ')}');
});
})(String.prototype.format);
Версии
Версия |
Описание |
1.00 05.02.2010 |
Первая публикация. |
1.01 22.02.2010 |
Добавлена возможность указать количество заполняющих пробелов. |
1.02 12.06.2010 |
Добавлена возможность настроить функции форматирования и возможность посмотреть код тестов без скачивания скрипта.
Показ кода тестов в FF работает с глюком, побороть его пока не получилось, если есть идеи - напишите. |