04.05.2012 00:00:27: Переработал дизайн (стало лучше или хуже?), пофиксил несколько неприятных багов.
Если нужен исходник плагина для фиксации навигации при скроллинге оставьте свой контакт.
Небольшое уточнение: весь код проверяю в IE начиная с версии 7 и в Chrome (на данный момент актуальна 18 версия), буду признателен за информацию об ошибках в других браузерах - пишите сообщения на соответствующих страницах.

JavaScript аналог String.Format C#

Что тут есть?

Те, кто пишут на C# очень хорошо знают и часто используют механизм String.Format, которого им сильно не хватает в JavaScript. Для облегчения жизни и был сделан этот небольшой скрипт - реализация String.Format для JavaScript. Естественно реализация один-к-одному крайне затруднительна и есть некоторые несовместимости, однако реализованный функционал позволяет делать достаточно удобные вещи.
Основные возможности:

  • Маркеры как в C#: {0}
  • Можно задавать используемую функцию форматирования: {0:d}
  • Можно передавать параметры функции форматирования: {0:n(,2)}
  • Можно регистрировать свои фунции форматирования
  • Два варианта вызова:
    1. Как в C#:
      var s = String.Format(format, arg0[, arg1[, arg2[...]]]);
    2. Как метод у объекта 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 варианта использования:

  1. Как в C#:
    var s = String.Format(format, arg0[, arg1[, arg2[...]]]);
  2. Как метод у объекта 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 работает с глюком, побороть его пока не получилось, если есть идеи - напишите.