Javascript.RU

PHP-функция: sprintf

Javascript:

function sprintf( ) {	// Return a formatted string
	// 
	// +   original by: Ash Searle (http://hexmen.com/blog/)
	// + namespaced by: Michael White (http://crestidg.com)

	var regex = /%%|%(\d+\$)?([-+#0 ]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([scboxXuidfegEG])/g;
	var a = arguments, i = 0, format = a[i++];

	// pad()
	var pad = function(str, len, chr, leftJustify) {
		var padding = (str.length >= len) ? '' : Array(1 + len - str.length >>> 0).join(chr);
		return leftJustify ? str + padding : padding + str;
	};

	// justify()
	var justify = function(value, prefix, leftJustify, minWidth, zeroPad) {
		var diff = minWidth - value.length;
		if (diff > 0) {
			if (leftJustify || !zeroPad) {
			value = pad(value, minWidth, ' ', leftJustify);
			} else {
			value = value.slice(0, prefix.length) + pad('', diff, '0', true) + value.slice(prefix.length);
			}
		}
		return value;
	};

	// formatBaseX()
	var formatBaseX = function(value, base, prefix, leftJustify, minWidth, precision, zeroPad) {
		// Note: casts negative numbers to positive ones
		var number = value >>> 0;
		prefix = prefix && number && {'2': '0b', '8': '0', '16': '0x'}[base] || '';
		value = prefix + pad(number.toString(base), precision || 0, '0', false);
		return justify(value, prefix, leftJustify, minWidth, zeroPad);
	};

	// formatString()
	var formatString = function(value, leftJustify, minWidth, precision, zeroPad) {
		if (precision != null) {
			value = value.slice(0, precision);
		}
		return justify(value, '', leftJustify, minWidth, zeroPad);
	};

	// finalFormat()
	var doFormat = function(substring, valueIndex, flags, minWidth, _, precision, type) {
		if (substring == '%%') return '%';

		// parse flags
		var leftJustify = false, positivePrefix = '', zeroPad = false, prefixBaseX = false;
		for (var j = 0; flags && j < flags.length; j++) switch (flags.charAt(j)) {
			case ' ': positivePrefix = ' '; break;
			case '+': positivePrefix = '+'; break;
			case '-': leftJustify = true; break;
			case '0': zeroPad = true; break;
			case '#': prefixBaseX = true; break;
		}

		// parameters may be null, undefined, empty-string or real valued
		// we want to ignore null, undefined and empty-string values
		if (!minWidth) {
			minWidth = 0;
		} else if (minWidth == '*') {
			minWidth = +a[i++];
		} else if (minWidth.charAt(0) == '*') {
			minWidth = +a[minWidth.slice(1, -1)];
		} else {
			minWidth = +minWidth;
		}

		// Note: undocumented perl feature:
		if (minWidth < 0) {
			minWidth = -minWidth;
			leftJustify = true;
		}

		if (!isFinite(minWidth)) {
			throw new Error('sprintf: (minimum-)width must be finite');
		}

		if (!precision) {
			precision = 'fFeE'.indexOf(type) > -1 ? 6 : (type == 'd') ? 0 : void(0);
		} else if (precision == '*') {
			precision = +a[i++];
		} else if (precision.charAt(0) == '*') {
			precision = +a[precision.slice(1, -1)];
		} else {
			precision = +precision;
		}

		// grab value using valueIndex if required?
		var value = valueIndex ? a[valueIndex.slice(0, -1)] : a[i++];

		switch (type) {
			case 's': return formatString(String(value), leftJustify, minWidth, precision, zeroPad);
			case 'c': return formatString(String.fromCharCode(+value), leftJustify, minWidth, precision, zeroPad);
			case 'b': return formatBaseX(value, 2, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
			case 'o': return formatBaseX(value, 8, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
			case 'x': return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
			case 'X': return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad).toUpperCase();
			case 'u': return formatBaseX(value, 10, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
			case 'i':
			case 'd': {
						var number = parseInt(+value);
						var prefix = number < 0 ? '-' : positivePrefix;
						value = prefix + pad(String(Math.abs(number)), precision, '0', false);
						return justify(value, prefix, leftJustify, minWidth, zeroPad);
					}
			case 'e':
			case 'E':
			case 'f':
			case 'F':
			case 'g':
			case 'G':
						{
						var number = +value;
						var prefix = number < 0 ? '-' : positivePrefix;
						var method = ['toExponential', 'toFixed', 'toPrecision']['efg'.indexOf(type.toLowerCase())];
						var textTransform = ['toString', 'toUpperCase']['eEfFgG'.indexOf(type) % 2];
						value = prefix + Math.abs(number)[method](precision);
						return justify(value, prefix, leftJustify, minWidth, zeroPad)[textTransform]();
					}
			default: return substring;
		}
	};

	return format.replace(regex, doFormat);
}

Примеры:

sprintf("%01.2f", 123.1);
123.10


Автор: Гость (не зарегистрирован), дата: 4 января, 2011 - 22:01
#permalink

Вместо нулей забивает %2d пробелами. Интернет забит имплементациями функции, но ни одного рабочего примера так и нет.


Автор: Гость (не зарегистрирован), дата: 4 января, 2011 - 22:03
#permalink

А нет, это я идиот. Надо было %02d писать. Спасибо за хорошую функцию.


Автор: dev5er6, дата: 20 ноября, 2012 - 17:18
#permalink
var sprintf=new function(){var f=['toString','toUpperCase','toLowerCase','toFixed','toExponential','toPrecision','fromCharCode','length'],
    formats={
     '%':function(v){return'%'},
     'b':function(v){return(+v)[f[0]](2)},
     'c':function(v){return String[f[6]](+v)},
     'C':function(v){return String[f[6]](+v)[f[1]]()},
     'd':function(v){return(+v)?+v:0},
     'e':function(v){return(+v)[f[4]]()[f[0]]()},
     'E':function(v){return(+v)[f[4]]()[f[1]]()},
     'f':function(v,p){return(+v)[f[3]](p)},
     'F':function(v,p){return(+v)[f[3]](p)},
     'g':function(v,p){return((+v)[f[5]](p)[f[0]]()[f[7]]<(+v)[f[4]]()[f[0]]()[f[7]]?(+v)[f[5]](p):(+v)[f[4]]())[f[0]]()},
     'G':function(v,p){return((+v)[f[5]](p)[f[0]]()[f[7]]<(+v)[f[4]]()[f[0]]()[f[7]]?(+v)[f[5]](p):(+v)[f[4]]())[f[1]]()},
     'o':function(v){return(  +v)[f[0]](8)},
     's':function(v){return(''+v)[f[0]]()},
     'S':function(v){return(''+v)[f[1]]()},
     'u':function(v){return Math.abs(+v)},
     'x':function(v){return(  +v)[f[0]](16)[f[2]]()},
     'X':function(v){return(  +v)[f[0]](16)[f[1]]()}
    },
    format=function(d){var i=0;return function(m,a,b,s,w,p,n,f){var r=''+formats[f]((typeof d[i]=='object')?d[(d.length==1)?i:i++][n]:d[(d.length==1)?i:i++],p);if(r=="%"&&d.length!=1)i--;if(a)b=a;while(b&&b.length&&r.length<+w)r=(s=="-")?(r+b):(b+r);return r}},
    re=new RegExp('%(?:(?:[\'\"](.)|([0 ]))?([+-])?(\\d+)?(?:\\.(\\d+))?(?:\\(([^)]+)\\))?)([%bcCdeEfFgGosSuxX])','g');
    return function(s){return s.replace(re,format(Array.apply(null,arguments).slice(1)))};
  };

sprintf('0x%06X',8) // "0x000008"
sprintf('0x%06(gg)X',{test:15,gg:8}) // "0x000008"
sprintf('0x%06(0)X',[15,8]) // "0x00000F"


Автор: Контра (не зарегистрирован), дата: 11 января, 2014 - 20:13
#permalink

Ваш аналог не полный. Так в пхп работает, а в аналоге на js - нет:
sprintf("%s%+'05.1f", 3500, 2.3)


Автор: Гость (не зарегистрирован), дата: 2 ноября, 2014 - 05:56
#permalink

var padding = (str.length >= len) ? '' : Array(1 + len - str.length >>> 0).join(chr);
Какая разница между >>> и >> ?
Где вообще можно прочитать об этой операции?


Автор: Гость (не зарегистрирован), дата: 24 ноября, 2014 - 16:10
#permalink

В операторах javascript


Автор: Гость (не зарегистрирован), дата: 15 апреля, 2022 - 23:35
#permalink

Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
4 + 3 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum