diff --git a/README.md b/README.md index 4f75996..7ead88d 100644 --- a/README.md +++ b/README.md @@ -20,13 +20,20 @@ Options Usage ------- - - $(function () { - $("input").calculadora({decimals: 0, useCommaAsDecimalMark: false}); - }) - \ No newline at end of file +

+    $(function () {
+        $("input").calculadora({decimals: 0, useCommaAsDecimalMark: false});
+    })
+
+Or: +

+    const nF = new Intl.NumberFormat('US', {style: 'decimal', maximumFractionDigits: 2, useGrouping: false});
+    $("input.calculator").calculadora({numberFormat: nF, parent_element: $('.modal-body')});
+
diff --git a/jquery.calculadora.js b/jquery.calculadora.js index 0d920b5..3382ab8 100644 --- a/jquery.calculadora.js +++ b/jquery.calculadora.js @@ -1,5 +1,5 @@ /* - * jQuery Calculadora 0.3 + * jQuery Calculadora 0.6 * Copyright 2013, Eduardo Molteni * */ @@ -7,150 +7,129 @@ (function ($) { var defaults = { decimals: 2, - useCommaAsDecimalMark: false + useCommaAsDecimalMark: false, + parent_element: $("body"), }; $.fn.extend({ calculadora: function(options) { - - var options = $.extend({}, defaults, options); + var options = $.extend({}, defaults, options); + + if(!options.numberFormat){ + options.numberFormat = (options.useCommaAsDecimalMark) ? + new Intl.NumberFormat('FR', {maximumFractionDigits: options.decimals}) : + new Intl.NumberFormat('US', {maximumFractionDigits: options.decimals}); + }; + var conf = {}; + conf.radix = options.numberFormat.format(0.1).slice(1,2); + conf.re = new RegExp(`[^-0-9${conf.radix}]`, 'g'); var ticket = $(''); var ticketUl = ticket.find("ul"); - $("body").append(ticket); + + while($('#calculadora').length != 0) { + $('#calculadora').remove(); + }; + $(options.parent_element).append(ticket); return this.each(function() { - var o = options; var self = $(this); - var LastOperator = 0; + var LastOperator = null; var TotalSoFar = 0; - var TicketIsVisible = false; self.blur(function (event) { - LastOperator = 0; + LastOperator = null; ticketUl.html(""); ticket.hide(); - TicketIsVisible = false; var number = parseLocalFloat(self.val()); - self.val(formatNumber(number, o.decimals)); + self.val(formatNumber(number)); }); self.keydown( function (event) { var number = parseLocalFloat(self.val()); - // if there's a number in the input: - if (number !== 0) - switch (event.which) { - // if the key is -+/*: - case 109: - case 107: - case 111: - case 106: - event.preventDefault(); - calculateSoFar( number ); - addToTicket(formatNumber(number, o.decimals), event.which); - LastOperator = event.which; - self.val(""); - break; - case 75: //if the key is 'k' - event.preventDefault(); - self.val(number * 1000); - break; - case 77: //if the key is 'M' - event.preventDefault(); - self.val(number * 1000000); - break; - break; - } - - // si la tecla es enter o tab o = - if (event.which == 13 || event.which == 9) { - console.log(event.which); - if (event.which == 13) { + switch (event.key) { + case '+': + case '-': + case '*': + case '/': event.preventDefault(); - } - calculateSoFar(number); - addToTicket(formatNumber(number, o.decimals), "="); - addToTicket(formatNumber(TotalSoFar, o.decimals), 0, "tot"); - self.val(formatNumber(TotalSoFar, o.decimals)); - LastOperator = 0; - } - } - ); - - self.keypress( - function (event) { - var number = parseLocalFloat(self.val()); - - if (event.which == 37) { - event.preventDefault(); - self.val(TotalSoFar * number / 100); - } + calculateSoFar( number ); + addToTicket(formatNumber(number), event.key); + LastOperator = event.key; + self.val(""); + break; + case 'Enter': + case '=': + event.preventDefault(); // allow default action for Tab key + case 'Tab': + calculateSoFar(number); + addToTicket(formatNumber(number), "="); + addToTicket(formatNumber(TotalSoFar), " ", "tot"); + self.val(formatNumber(TotalSoFar)); + LastOperator = null; + self.change(); + break; + case 'k': + event.preventDefault(); + self.val(number * 1000); + break; + case 'M': + event.preventDefault(); + self.val(number * 1000000); + break; + case 'm': + event.preventDefault(); + if (number !== 0) self.val(number / 1000); + break; + }; } ); function calculateSoFar(number) { - if (LastOperator === 0) { - TotalSoFar = number; - } - else { - // prevent using eval - if (LastOperator == 109) TotalSoFar = TotalSoFar - number; - if (LastOperator == 107) TotalSoFar = TotalSoFar + number; - if (LastOperator == 111 && number !== 0) TotalSoFar = TotalSoFar / number; - if (LastOperator == 111 && number === 0) TotalSoFar = 0; - if (LastOperator == 106) TotalSoFar = TotalSoFar * number; - } - } - - function addToTicket(text, which, liclass) { - var pos = self.offset(); - if (!TicketIsVisible && pos) { - ticket.css('top', (pos.top - 15) + "px"); - ticket.css('left', pos.left + "px"); + switch (LastOperator) { + case null: + TotalSoFar = number; + break; + case '+': + TotalSoFar = TotalSoFar + number; + break; + case '-': + TotalSoFar = TotalSoFar - number; + break; + case '*': + TotalSoFar = TotalSoFar * number; + break; + case '/': + TotalSoFar = (number !== 0) ? TotalSoFar / number : 0; + break; + }; + }; + + function addToTicket(text, display_operator, liclass) { + if (!ticket.is(":visible")) { ticket.css('min-width', self.width() + "px"); - //ticket.show("slide", { direction: "up" }, 1000); ticket.show(); - TicketIsVisible = true; - } - ticketUl.append("
  • " + operatorForCode(which) + "
    " + text + "
  • "); - ticket.css('top', (pos.top - ticket.height()) + "px"); - } + ticket.offset({top: self.offset().top-15, left: self.offset().left}); + }; + ticketUl.append("
  • " + display_operator + "
    " + text + "
  • "); + ticket.offset({top: ticket.offset().top-15, left: ticket.offset().left}); + }; }); - function parseLocalFloat(num) { if (!num) return 0; - if (options.useCommaAsDecimalMark) { - return parseFloat((num.replace(/\./g, "").replace(/ /g, "").replace("$", "").replace(",", "."))); - } - return parseFloat(num.replace(/,/g, "")); - } - - function formatNumber(n, c) { - var d = "."; var t = ","; - if (options.useCommaAsDecimalMark) { - d = ","; t = "."; - } - c = isNaN(c = Math.abs(c)) ? 2 : c, d = d == undefined ? "," : d, t = t == undefined ? "." : t, s = n < 0 ? "-" : "", i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "", j = (j = i.length) > 3 ? j % 3 : 0; - return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : ""); + num = num.replace(conf.re, '').replace(conf.radix, '.'); + return parseFloat(num) }; - - - function operatorForCode(whichKeyCode) { - if (whichKeyCode == 109) return("-"); - if (whichKeyCode == 107) return ("+"); - if (whichKeyCode == 111) return ("/"); - if (whichKeyCode == 106) return ("*"); - if (whichKeyCode == "=") return ("="); - return ""; - } + function formatNumber(num) { + return options.numberFormat.format(num) + }; } }); - -})(jQuery); +})(jQuery); diff --git a/jquery.calculadora.min.js b/jquery.calculadora.min.js index 281a896..eb737ba 100644 --- a/jquery.calculadora.min.js +++ b/jquery.calculadora.min.js @@ -1,2 +1,2 @@ -(function(e){e.fn.extend({calculadora:function(t){function u(e){if(!e)return 0;if(t.useCommaAsDecimalMark){return parseFloat(e.replace(/\./g,"").replace(/ /g,"").replace("$","").replace(",","."))}return parseFloat(e.replace(",",""))}function a(e,n){var r=".";var o=",";if(t.useCommaAsDecimalMark){r=",";o="."}n=isNaN(n=Math.abs(n))?2:n,r=r==undefined?",":r,o=o==undefined?".":o,s=e<0?"-":"",i=parseInt(e=Math.abs(+e||0).toFixed(n))+"",j=(j=i.length)>3?j%3:0;return s+(j?i.substr(0,j)+o:"")+i.substr(j).replace(/(\d{3})(?=\d)/g,"$1"+o)+(n?r+Math.abs(e-i).toFixed(n).slice(2):"")}function f(e){if(e==109)return"-";if(e==107)return"+";if(e==111)return"/";if(e==106)return"*";if(e=="=")return"=";return""}var n={decimals:2,useCommaAsDecimalMark:false};var t=e.extend(n,t);var r=e('');var o=r.find("ul");e("body").append(r);return this.each(function(){function h(e){if(s===0){l=e}else{if(s==109)l=l-e;if(s==107)l=l+e;if(s==111&&e!==0)l=l/e;if(s==111&&e===0)l=0;if(s==106)l=l*e}}function p(e,t,n){var s=i.offset();if(!c&&s){r.css("top",s.top-15+"px");r.css("left",s.left+"px");r.css("min-width",i.width()+"px");r.show();c=true}o.append("
  • "+f(t)+"
    "+e+"
  • ");r.css("top",s.top-r.height()+"px")}var n=t;var i=e(this);var s=0;var l=0;var c=false;i.blur(function(e){s=0;o.html("");r.hide();c=false});i.keydown(function(e){var t=i.val();var r=u(t);if(r!==0&&(e.which===109||e.which===107||e.which===111||e.which===106)){e.preventDefault();h(r);p(a(r,n.decimals),e.which);s=e.which;i.val("")}if(e.which==13||e.which==9){if(e.which==13){e.preventDefault()}h(r);p(a(r,n.decimals),"=");p(a(l,n.decimals),0,"tot");i.val(a(l,n.decimals));s=0}})});}})})(jQuery) +!function(e){var a={decimals:2,useCommaAsDecimalMark:!1,parent_element:e("body")};e.fn.extend({calculadora:function(t){(t=e.extend({},a,t)).numberFormat||(t.numberFormat=t.useCommaAsDecimalMark?new Intl.NumberFormat("FR",{maximumFractionDigits:t.decimals}):new Intl.NumberFormat("US",{maximumFractionDigits:t.decimals}));var r={};r.radix=t.numberFormat.format(.1).slice(1,2),r.re=new RegExp(`[^-0-9${r.radix}]`,"g");for(var l=e(''),n=l.find("ul");0!=e("#calculadora").length;)e("#calculadora").remove();return e(t.parent_element).append(l),this.each(function(){var a=e(this),t=null,r=0;function i(e){switch(t){case null:r=e;break;case"+":r+=e;break;case"-":r-=e;break;case"*":r*=e;break;case"/":r=0!==e?r/e:0}}function o(e,t,r){l.is(":visible")||(l.css("min-width",a.width()+"px"),l.show(),l.offset({top:a.offset().top-15,left:a.offset().left})),n.append("
  • "+t+"
    "+e+"
  • "),l.offset({top:l.offset().top-15,left:l.offset().left})}a.blur(function(e){t=null,n.html(""),l.hide();var r=s(a.val());a.val(c(r))}),a.keydown(function(e){var l=s(a.val());switch(e.key){case"+":case"-":case"*":case"/":e.preventDefault(),i(l),o(c(l),e.key),t=e.key,a.val("");break;case"Enter":case"=":e.preventDefault();case"Tab":i(l),o(c(l),"="),o(c(r)," ","tot"),a.val(c(r)),t=null,a.change();break;case"k":e.preventDefault(),a.val(1e3*l);break;case"M":e.preventDefault(),a.val(1e6*l);break;case"m":e.preventDefault(),0!==l&&a.val(l/1e3)}})});function s(e){return e?(e=e.replace(r.re,"").replace(r.radix,"."),parseFloat(e)):0}function c(e){return t.numberFormat.format(e)}}})}(jQuery); //@ sourceMappingURL=jquery.calculadora.min.js.map \ No newline at end of file