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
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);
|