Подборка функций на JavaScript для работы с числами с плавающей запятой
Несколько полезных функций (написанных не мной) для работы с числами с плавающей запятой в виде jQuery-плагина.
(function($) {
$.extend({
floats : {
/*
If you know who is an author of number_format() code --
please let me know, I'll update copyrights
*/
/*
Аналог PHP-функции number_format (http://php.net/manual/ru/function.number-format.php)
Пример использования:
var some_string_var = $.floats.number_format(1.5, 2, ',', ' ');
*/
number_format: function (number, decimals, dec_point, thousands_sep) {
var exponent = "";
var numberstr = number.toString();
var eindex = numberstr.indexOf("e");
var i, z;
if (eindex > -1) {
exponent = numberstr.substring(eindex);
number = parseFloat(numberstr.substring(0, eindex));
}
if (decimals != null) {
var temp = Math.pow(10, decimals);
number = Math.round(number * temp) / temp;
}
var sign = number < 0 ? "-" : "";
var integer = (number > 0 ? Math.floor(number) : Math.abs(Math.ceil(number))).toString();
var fractional = number.toString().substring(integer.length + sign.length);
dec_point = dec_point != null ? dec_point : ".";
fractional = decimals != null && decimals > 0 || fractional.length > 1 ? (dec_point + fractional.substring(1)) : "";
if (decimals != null && decimals > 0) {
for (i = fractional.length - 1, z = decimals; i < z; ++i)
fractional += "0";
}
thousands_sep = (thousands_sep != dec_point || fractional.length == 0) ? thousands_sep : null;
if (thousands_sep != null && thousands_sep != "") {
for (i = integer.length - 3; i > 0; i -= 3)
integer = integer.substring(0, i) + thousands_sep + integer.substring(i);
}
return sign + integer + fractional + exponent;
},
/*
Преобразовывает строку во float, игнорируя разделители разрядов.
Десятичным разделителем может быть как точка, так и запятая
*/
parseRussianFloat : function(input)
{
var temp = parseFloat(input.replace(/[^\d,\.]/g, '').replace(',', '.'));
return (!isNaN(temp)) ? temp : 0;
},
/*
Шорткат для форматирования по нашим правилам
*/
formatRussianFloat : function(input)
{
return $.floats.number_format(input, 2, ',', ' ');
},
/*
Небольшой бонус:
$.floats.formatRussianQuantity(count, [ 'товар', 'товара', 'товаров' ])); => "5 товаров"
*/
formatRussianQuantity : function(number, titles)
{
cases = [2, 0, 1, 1, 1, 2];
return titles[ (number%100>4 && number%100<20)? 2 : cases[(number%10<5)?number%10:5] ];
}
}
});
})(jQuery);
