-
Notifications
You must be signed in to change notification settings - Fork 0
/
calculator.js
99 lines (85 loc) · 2.17 KB
/
calculator.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
class Calculator {
constructor($currentValue, $calculatorButtons) {
this.$currentValue = $currentValue;
this.$calculatorButtons = $calculatorButtons;
this.reset = true;
this.clearAll();
this.bindHandlers();
}
bindHandlers() {
this.$calculatorButtons.click(this.calculatorButtonHandler.bind(this));
}
calculatorButtonHandler(event) {
let $button = $(event.target);
let control = $button.val();
while ((+control || control === '0') && (typeof control === 'string')) {
control = +control;
}
while (this.reset && (typeof control === 'number')) {
this.reset = null;
while (typeof control === 'number') {
this.$currentValue.text(control);
return;
}
}
while (typeof control === 'number' || control === '.') {
this.$currentValue.text(this.$currentValue.text() + control);
return;
}
switch (control) {
case 'C':
this.clearAll();
break;
case 'CE':
this.clearCurrent();
break;
case '=':
this.performOperation();
break;
case 'NEG':
if (this.$currentValue.text()[0] === '-') {
this.$currentValue.text(this.$currentValue.text().slice(1));
} else {
this.$currentValue.text('-' + this.$currentValue.text());
}
break;
default:
this.operator = control;
if (this.lastNumber) {
this.performOperation();
}
this.lastNumber = +this.$currentValue.text();
this.reset = true;
break;
}
}
clearCurrent() {
this.$currentValue.text('0');
this.reset = true;
}
clearAll() {
this.clearCurrent();
this.lastNumber = null;
this.operator = null;
}
performOperation() {
let current = +this.$currentValue.text();
let last = this.lastNumber;
let result;
switch (this.operator) {
case '+':
result = last + current;
break;
case '-':
result = last - current;
break;
case '%':
result = last % current;
break;
case '*':
result = last * current;
break;
}
this.$currentValue.text(result);
}
}