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;
}
как бы не совсем корректно отрабатывает скрипт на отрицательных значениях, пришлось поправить в двух местах:
var i, j, kw, kd, km, minus = "";
if(number < 0){
minus = "-";
number = number*-1;
}
и соотвественно на выходе:
return minus + km + kw + kd;
Скрипт неправильно форматирует числа в промежутке от 10000 до 99999. Например, число 43150 при таком обращении number_format(43150, 0, '.', ' ') выводит 431 50, вместо ожидаемых 43 150.
Уточнение! Данная проблема действительна для всех отрицательных чисел. Положительные числа (в том числе и указанные в предыдущем сообщении) обрабатываются корректно.
Разделение на группы по три символа, заменить 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;
Спасибо! Очень пригодилось
Есть встроенный объект для этого
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat
После того, как в инпуте уже появился пробел (например, 3 000), функция возвращает 0. Победить получилось путем добавления строки в начало функции:
Roksa koźmin
Сравниваю несколько разных функций на предмет корректности их работы и в этой есть проблемы, кроме изложенных выше.
Если передать -0.35, то в результате будет "0.35" без знака, как и для любого числа между 0 и 1. Так же проблема возникнет с отрицательными числами, количество символов в целой части которых кратно трем, например -300 выдаст: "- 300.00", -600000.00 выдаст "- 600000.00".
Отправить комментарий
Приветствуются комментарии:Для остальных вопросов и обсуждений есть форум.