You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

229 lines
7.9 KiB

/*
* Price Format jQuery Plugin
* Created By Eduardo Cuducos cuducos [at] gmail [dot] com
* Currently maintained by Flavio Silveira flavio [at] gmail [dot] com
* Version: 1.7
* Release: 2012-02-22
* original char limit by Flavio Silveira <http://flaviosilveira.com>
* original keydown event attachment by Kaihua Qi
* keydown fixes by Thasmo <http://thasmo.com>
* Clear Prefix on Blur suggest by Ricardo Mendes from PhonoWay
* original allow negative by Cagdas Ucar <http://carsinia.com>
* keypad fixes by Carlos Vinicius <http://www.kvinicius.com.br> and Rayron Victor
* original Suffix by Marlon Pires Junior
*/
(function ($) {
/****************
* Main Function *
*****************/
$.fn.priceFormat = function (options) {
var defaults =
{
prefix: 'US$ ',
suffix: '',
centsSeparator: '.',
thousandsSeparator: ',',
limit: false,
centsLimit: 2,
clearPrefix: false,
clearSufix: false,
allowNegative: false
};
var options = $.extend(defaults, options);
return this.each(function () {
// pre defined options
var obj = $(this);
var is_number = /[0-9]/;
// load the pluggings settings
var prefix = options.prefix;
var suffix = options.suffix;
var centsSeparator = options.centsSeparator;
var thousandsSeparator = options.thousandsSeparator;
var limit = options.limit;
var centsLimit = options.centsLimit;
var clearPrefix = options.clearPrefix;
var clearSuffix = options.clearSuffix;
var allowNegative = options.allowNegative;
// skip everything that isn't a number
// and also skip the left zeroes
function to_numbers(str) {
var formatted = '';
for (var i = 0; i < (str.length); i++) {
char_ = str.charAt(i);
if (formatted.length == 0 && char_ == 0) char_ = false;
if (char_ && char_.match(is_number)) {
if (limit) {
if (formatted.length < limit) formatted = formatted + char_;
}
else {
formatted = formatted + char_;
}
}
}
return formatted;
}
// format to fill with zeros to complete cents chars
function fill_with_zeroes(str) {
while (str.length < (centsLimit + 1)) str = '0' + str;
return str;
}
// format as price
function price_format(str) {
// formatting settings
var formatted = fill_with_zeroes(to_numbers(str));
var thousandsFormatted = '';
var thousandsCount = 0;
// split integer from cents
var centsVal = formatted.substr(formatted.length - centsLimit, centsLimit);
var integerVal = formatted.substr(0, formatted.length - centsLimit);
// apply cents pontuation
formatted = integerVal + centsSeparator + centsVal;
// apply thousands pontuation
if (thousandsSeparator) {
for (var j = integerVal.length; j > 0; j--) {
char_ = integerVal.substr(j - 1, 1);
thousandsCount++;
if (thousandsCount % 3 == 0) char_ = thousandsSeparator + char_;
thousandsFormatted = char_ + thousandsFormatted;
}
if (thousandsFormatted.substr(0, 1) == thousandsSeparator) thousandsFormatted = thousandsFormatted.substring(1, thousandsFormatted.length);
formatted = thousandsFormatted + centsSeparator + centsVal;
}
// if the string contains a dash, it is negative - add it to the begining (except for zero)
if (allowNegative && str.indexOf('-') != -1 && (integerVal != 0 || centsVal != 0)) formatted = '-' + formatted;
// apply the prefix
if (prefix) formatted = prefix + formatted;
// apply the suffix
if (suffix) formatted = formatted + suffix;
return formatted;
}
// filter what user type (only numbers and functional keys)
function key_check(e) {
var code = (e.keyCode ? e.keyCode : e.which);
var typed = String.fromCharCode(code);
var functional = false;
var str = obj.val();
var newValue = price_format(str + typed);
// allow key numbers, 0 to 9
if ((code >= 48 && code <= 57) || (code >= 96 && code <= 105)) functional = true;
// check Backspace, Tab, Enter, Delete, and left/right arrows
if (code == 8) functional = true;
if (code == 9) functional = true;
if (code == 13) functional = true;
if (code == 46) functional = true;
if (code == 37) functional = true;
if (code == 39) functional = true;
if (allowNegative && (code == 189 || code == 109)) functional = true; // dash as well
if (!functional) {
e.preventDefault();
e.stopPropagation();
if (str != newValue) obj.val(newValue);
}
}
// inster formatted price as a value of an input field
function price_it() {
var str = obj.val();
var price = price_format(str);
if (str != price) obj.val(price);
}
// Add prefix on focus
function add_prefix() {
var val = obj.val();
obj.val(prefix + val);
}
function add_suffix() {
var val = obj.val();
obj.val(val + suffix);
}
// Clear prefix on blur if is set to true
function clear_prefix() {
if ($.trim(prefix) != '' && clearPrefix) {
var array = obj.val().split(prefix);
obj.val(array[1]);
}
}
// Clear suffix on blur if is set to true
function clear_suffix() {
if ($.trim(suffix) != '' && clearSuffix) {
var array = obj.val().split(suffix);
obj.val(array[0]);
}
}
// bind the actions
$(this).bind('keydown', key_check);
$(this).bind('keyup', price_it);
// Clear Prefix and Add Prefix
if (clearPrefix) {
$(this).bind('focusout', function () {
clear_prefix();
});
$(this).bind('focusin', function () {
add_prefix();
});
}
// Clear Suffix and Add Suffix
if (clearSuffix) {
$(this).bind('focusout', function () {
clear_suffix();
});
$(this).bind('focusin', function () {
add_suffix();
});
}
// If value has content
if ($(this).val().length > 0) {
price_it();
clear_prefix();
clear_suffix();
}
});
};
/******************
* Unmask Function *
*******************/
jQuery.fn.unmask = function () {
var field = $(this).val();
var result = "";
for (var f in field) {
if (!isNaN(field[f]) || field[f] == "-") result += field[f];
}
return result;
};
})(jQuery);