-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
146 lines (132 loc) · 4.87 KB
/
index.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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
class Calculator {
constructor(previousOperandTextElement, currentOperandTextElement) {
// Store references to the HTML elements where the operands will be displayed
this.previousOperandTextElement = previousOperandTextElement;
this.currentOperandTextElement = currentOperandTextElement;
// Initialize calculator by clearing all values
this.clear();
}
// Clear the current and previous operands and reset the operation
clear() {
this.currentOperand = '';
this.previousOperand = '';
this.operation = undefined;
}
// Remove the last digit from the current operand
delete() {
this.currentOperand = this.currentOperand.toString().slice(0, -1);
}
// Append a number or decimal point to the current operand
appendNumber(number) {
// Prevent multiple decimals from being added
if (number === '.' && this.currentOperand.includes('.')) return;
this.currentOperand = this.currentOperand.toString() + number.toString();
}
// Select an operation (+, -, *, /) and prepare for the next operand
chooseOperation(operation) {
// Do nothing if current operand is empty
if (this.currentOperand === '') return;
// If there's a previous operand, compute the result before setting the operation
if (this.previousOperand !== '') {
this.compute();
}
this.operation = operation;
this.previousOperand = this.currentOperand;
this.currentOperand = '';
}
// Perform the computation based on the selected operation
compute() {
let computation;
const prev = parseFloat(this.previousOperand);
const current = parseFloat(this.currentOperand);
// Exit if either operand is not a number
if (isNaN(prev) || isNaN(current)) return;
// Perform the calculation based on the operation
switch (this.operation) {
case '+':
computation = prev + current;
break;
case '-':
computation = prev - current;
break;
case '×':
computation = prev * current;
break;
case '÷':
computation = prev / current;
break;
default:
return;
}
this.currentOperand = computation;
this.operation = undefined;
this.previousOperand = '';
}
// Format the number for display, adding commas for thousands
getDisplayNumber(number) {
const stringNumber = number.toString();
const integerDigits = parseFloat(stringNumber.split('.')[0]);
const decimalDigits = stringNumber.split('.')[1];
let integerDisplay;
if (isNaN(integerDigits)) {
integerDisplay = '';
} else {
integerDisplay = integerDigits.toLocaleString('en', { maximumFractionDigits: 0 });
}
if (decimalDigits != null) {
return `${integerDisplay}.${decimalDigits}`;
} else {
return integerDisplay;
}
}
// Update the display with the current and previous operands and operation
updateDisplay() {
this.currentOperandTextElement.innerText =
this.getDisplayNumber(this.currentOperand);
if (this.operation != null) {
this.previousOperandTextElement.innerText =
`${this.getDisplayNumber(this.previousOperand)} ${this.operation}`;
} else {
this.previousOperandTextElement.innerText = '';
}
}
}
// Select all the buttons and text elements for the calculator
const numberButtons = document.querySelectorAll('[data-number]');
const operationButtons = document.querySelectorAll('[data-operation]');
const equalButton = document.querySelector('[data-equals]');
const deleteButton = document.querySelector('[data-delete]');
const allClearButton = document.querySelector('[data-all-clear]');
const previousOperandTextElement = document.querySelector('[data-previous-operand]');
const currentOperandTextElement = document.querySelector('[data-current-operand]');
// Create a new calculator instance
const calculator = new Calculator(previousOperandTextElement, currentOperandTextElement);
// Add event listeners to each number button to append the number to the current operand
numberButtons.forEach(button => {
button.addEventListener('click', () => {
calculator.appendNumber(button.innerText);
calculator.updateDisplay();
});
});
// Add event listeners to each operation button to choose the operation
operationButtons.forEach(button => {
button.addEventListener('click', () => {
calculator.chooseOperation(button.innerText);
calculator.updateDisplay();
});
});
// Add event listener to the equals button to compute the result
equalButton.addEventListener('click', button => {
calculator.compute();
calculator.updateDisplay();
});
// Add event listener to the all clear button to reset the calculator
allClearButton.addEventListener('click', button => {
calculator.clear();
calculator.updateDisplay();
});
// Add event listener to the delete button to remove the last digit
deleteButton.addEventListener('click', button => {
calculator.delete();
calculator.updateDisplay();
});