UNPKG

alpaca

Version:

Alpaca provides the easiest and fastest way to generate interactive forms for the web and mobile devices. It runs simply as HTML5 or more elaborately using Bootstrap, jQuery Mobile or jQuery UI. Alpaca uses Handlebars to process JSON schema and provide

328 lines (274 loc) 7.61 kB
/* * Price Format jQuery Plugin * Created By Eduardo Cuducos * Currently maintained by Flavio Silveira flavio [at] gmail [dot] com * Version: 2.0 * Release: 2014-01-26 */ (function($) { /**************** * Main Function * *****************/ $.fn.priceFormat = function(options) { var defaults = { prefix: 'US$ ', suffix: '', centsSeparator: '.', thousandsSeparator: ',', limit: false, centsLimit: 2, clearPrefix: false, clearSufix: false, allowNegative: false, insertPlusSign: false, clearOnEmpty:false }; var options = $.extend(defaults, options); return this.each(function() { // pre defined options var obj = $(this); var value = ''; var is_number = /[0-9]/; // Check if is an input if(obj.is('input')) value = obj.val(); else value = obj.html(); // 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; var insertPlusSign = options.insertPlusSign; var clearOnEmpty = options.clearOnEmpty; // If insertPlusSign is on, it automatic turns on allowNegative, to work with Signs if (insertPlusSign) allowNegative = true; function set(nvalue) { if(obj.is('input')) obj.val(nvalue); else obj.html(nvalue); } function get() { if(obj.is('input')) value = obj.val(); else value = obj.html(); return value; } // 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, ignore) { if(!ignore && (str === '' || str == price_format('0', true)) && clearOnEmpty) return ''; // formatting settings var formatted = fill_with_zeroes(to_numbers(str)); var thousandsFormatted = ''; var thousandsCount = 0; // Checking CentsLimit if(centsLimit == 0) { centsSeparator = ""; centsVal = ""; } // split integer from cents var centsVal = formatted.substr(formatted.length-centsLimit,centsLimit); var integerVal = formatted.substr(0,formatted.length-centsLimit); // apply cents pontuation formatted = (centsLimit==0) ? integerVal : integerVal+centsSeparator+centsVal; // apply thousands pontuation if (thousandsSeparator || $.trim(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 = (centsLimit==0) ? thousandsFormatted : thousandsFormatted+centsSeparator+centsVal; } // if the string contains a dash, it is negative - add it to the begining (except for zero) if (allowNegative && (integerVal != 0 || centsVal != 0)) { if (str.indexOf('-') != -1 && str.indexOf('+')<str.indexOf('-') ) { formatted = '-' + formatted; } else { if(!insertPlusSign) formatted = '' + formatted; else 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 = value; 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; // Minus Sign, Plus Sign if (allowNegative && (code == 189 || code == 109 || code == 173)) functional = true; if (insertPlusSign && (code == 187 || code == 107 || code == 61)) functional = true; if (!functional) { e.preventDefault(); e.stopPropagation(); if (str!=newValue) set(newValue); } } // Formatted price as a value function price_it () { var str = get(); var price = price_format(str); if (str != price) set(price); if(parseFloat(str) == 0.0 && clearOnEmpty) set(''); } // Add prefix on focus function add_prefix() { obj.val(prefix + get()); } function add_suffix() { obj.val(get() + suffix); } // Clear prefix on blur if is set to true function clear_prefix() { if($.trim(prefix) != '' && clearPrefix) { var array = get().split(prefix); set(array[1]); } } // Clear suffix on blur if is set to true function clear_suffix() { if($.trim(suffix) != '' && clearSuffix) { var array = get().split(suffix); set(array[0]); } } // bind the actions obj.bind('keydown.price_format', key_check); obj.bind('keyup.price_format', price_it); obj.bind('focusout.price_format', price_it); // Clear Prefix and Add Prefix if(clearPrefix) { obj.bind('focusout.price_format', function() { clear_prefix(); }); obj.bind('focusin.price_format', function() { add_prefix(); }); } // Clear Suffix and Add Suffix if(clearSuffix) { obj.bind('focusout.price_format', function() { clear_suffix(); }); obj.bind('focusin.price_format', function() { add_suffix(); }); } // If value has content if (get().length>0) { price_it(); clear_prefix(); clear_suffix(); } }); }; /********************** * Remove price format * ***********************/ $.fn.unpriceFormat = function(){ return $(this).unbind(".price_format"); }; /****************** * Unmask Function * *******************/ $.fn.unmask = function(){ var field; var result = ""; if($(this).is('input')) field = $(this).val(); else field = $(this).html(); for(var f in field) { if(!isNaN(field[f]) || field[f] == "-") result += field[f]; } return result; }; })(jQuery);