Подборка функций на JavaScript для работы с числами с плавающей запятой

15.04.2011 18:07 / Артём Волк / 773 просмотра / ...

Несколько полезных функций (написанных не мной) для работы с числами с плавающей запятой в виде 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);