diff --git a/README.md b/README.md index 4f75996..7ead88d 100644 --- a/README.md +++ b/README.md @@ -20,13 +20,20 @@ Options
decimals Number of decimals to show in the ticket and in the result value. Default is '2'
useCommaAsDecimalMark If true, use the comma to parse the numbers and to show the values. Default is 'false'
+ numberFormat Intl.NumberFormat() which can contain further formatting options. See: MDN: NumberFormat for more. Optional. Will default to 'US' if useCommaAsDecimalMark is provided and true, or 'FR' if useCommaAsDecimalMark is provided and false
+ parent_element Parent element to attach the calculator "ticket", use to control visibility. Default is $("body")
- $(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("