/*
Property: numberFormat
	Format a number with grouped thousands.

Arguments:
	decimals, optional - integer, number of decimal percision; default, 2
	dec_point, optional - string, decimal point notation; default, '.'
	thousands_sep, optional - string, grouped thousands notation; default, ','

Returns:
	a formatted version of number.

Example:
	>(36432.556).numberFormat()  // returns 36,432.56
	>(36432.556).numberFormat(2, '.', ',')  // returns 36,432.56
*/

(function($){	
	$.numberFormat = function(val, decimals, dec_point, thousands_sep){
		var val = val || 0;
		var decimals = Math.abs(decimals) + 1 ? decimals : 2;
		var dec_point = dec_point || '.';
		var thousands_sep = thousands_sep || ',';

		var matches = /(-)?(\d+)(\.\d+)?/.exec((isNaN(val) ? 0 : val) + ''); // returns matches[1] as sign, matches[2] as numbers and matches[2] as decimals
		var remainder = matches[2].length > 3 ? matches[2].length % 3 : 0;
		return (matches[1] ? matches[1] : '') + (remainder ? matches[2].substr(0, remainder) + thousands_sep : '') + matches[2].substr(remainder).replace(/(\d{3})(?=\d)/g, "$1" + thousands_sep) + 
				(decimals ? dec_point + (+matches[3] || 0).toFixed(decimals).substr(2) : '');
	};

	$.fn.extend({
		numberFormat : function(decimals, dec_point, thousands_sep) {
			var val = $(this).val();
			return $.numberFormat(val, decimals, dec_point, thousands_sep);
		}
	});

})(jQuery);
Number.prototype.numberFormat = function(decimals, dec_point, thousands_sep){
	var val = this;
	var decimals = Math.abs(decimals) + 1 ? decimals : 2;
	var dec_point = dec_point || '.';
	var thousands_sep = thousands_sep || ',';
	var matches = /(-)?(\d+)(\.\d+)?/.exec((isNaN(val) ? 0 : val) + ''); // returns matches[1] as sign, matches[2] as numbers and matches[2] as decimals
	var remainder = matches[2].length > 3 ? matches[2].length % 3 : 0;
	return (matches[1] ? matches[1] : '') + (remainder ? matches[2].substr(0, remainder) + thousands_sep : '') + matches[2].substr(remainder).replace(/(\d{3})(?=\d)/g, "$1" + thousands_sep) + 
			(decimals ? dec_point + (+matches[3] || 0).toFixed(decimals).substr(2) : '');
};