Javascript.RU

PHP-функция: number_format

Javascript:

function number_format( number, decimals, dec_point, thousands_sep ) {	// Format a number with grouped thousands
	// 
	// +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
	// +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	// +	 bugfix by: Michael White (http://crestidg.com)

	var i, j, kw, kd, km;

	// input sanitation & defaults
	if( isNaN(decimals = Math.abs(decimals)) ){
		decimals = 2;
	}
	if( dec_point == undefined ){
		dec_point = ",";
	}
	if( thousands_sep == undefined ){
		thousands_sep = ".";
	}

	i = parseInt(number = (+number || 0).toFixed(decimals)) + "";

	if( (j = i.length) > 3 ){
		j = j % 3;
	} else{
		j = 0;
	}

	km = (j ? i.substr(0, j) + thousands_sep : "");
	kw = i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousands_sep);
	//kd = (decimals ? dec_point + Math.abs(number - i).toFixed(decimals).slice(2) : "");
	kd = (decimals ? dec_point + Math.abs(number - i).toFixed(decimals).replace(/-/, 0).slice(2) : "");


	return km + kw + kd;
}

Примеры:

number_format(1234.5678, 2, '.', '');
1234.57


Автор: Rip (не зарегистрирован), дата: 5 февраля, 2010 - 21:03
#permalink

как бы не совсем корректно отрабатывает скрипт на отрицательных значениях, пришлось поправить в двух местах:

var i, j, kw, kd, km, minus = "";

if(number < 0){
minus = "-";
number = number*-1;
}

и соотвественно на выходе:


return minus + km + kw + kd;


Автор: misdaik (не зарегистрирован), дата: 26 января, 2012 - 02:29
#permalink

Скрипт неправильно форматирует числа в промежутке от 10000 до 99999. Например, число 43150 при таком обращении number_format(43150, 0, '.', ' ') выводит 431 50, вместо ожидаемых 43 150.


Автор: misdaik (не зарегистрирован), дата: 26 января, 2012 - 02:59
#permalink

Уточнение! Данная проблема действительна для всех отрицательных чисел. Положительные числа (в том числе и указанные в предыдущем сообщении) обрабатываются корректно.


Автор: Житель Земли (не зарегистрирован), дата: 17 ноября, 2014 - 08:27
#permalink

Разделение на группы по три символа, заменить 8 строк:
22| if( (j = i.length) > 3 ){
23| j = j % 3;
24| } else{
25| j = 0;
26| }
27|
28| km = (j ? i.substr(0, j) + thousands_sep : "");
29| kw = i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousands_sep);

на одну строку:
kw = i.split( /(?=(?:\d{3})+$)/ ).join( thousands_sep );

и возвращать без km
return kw + kd;


Автор: Egynne (не зарегистрирован), дата: 19 мая, 2015 - 11:40
#permalink

Спасибо! Очень пригодилось


Автор: Гость (не зарегистрирован), дата: 15 августа, 2016 - 16:08
#permalink

Есть встроенный объект для этого

new Intl.NumberFormat().format(3500.23)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat


Автор: Гость (не зарегистрирован), дата: 10 февраля, 2018 - 14:46
#permalink

После того, как в инпуте уже появился пробел (например, 3 000), функция возвращает 0. Победить получилось путем добавления строки в начало функции:

number = number.replace(/\s/ig, '');

Автор: SinFx (не зарегистрирован), дата: 14 октября, 2023 - 18:28
#permalink

Сравниваю несколько разных функций на предмет корректности их работы и в этой есть проблемы, кроме изложенных выше.

Если передать -0.35, то в результате будет "0.35" без знака, как и для любого числа между 0 и 1. Так же проблема возникнет с отрицательными числами, количество символов в целой части которых кратно трем, например -300 выдаст: "- 300.00", -600000.00 выдаст "- 600000.00".


 
Поиск по сайту
Содержание

Учебник javascript

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

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

Интерфейсы

Все об AJAX

Оптимизация

Разное

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

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