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, '');

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

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

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

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


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

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
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
Антиспам
8 + 6 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Содержание

Учебник javascript

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

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

Интерфейсы

Все об AJAX

Оптимизация

Разное

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

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