-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
150 lines (132 loc) · 5.42 KB
/
script.js
File metadata and controls
150 lines (132 loc) · 5.42 KB
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
147
148
149
150
class Calculator { //Defines the calculator logic
constructor(previousOperandTextElement, currentOperandTextElement) { //Initialize the cal to display current and previous operands
this.previousOperandTextElement = previousOperandTextElement
this.currentOperandTextElement = currentOperandTextElement
this.clear()
}
clear() { //Clears the current operand, previous operand, and operation.
this.currentOperand = ''
this.previousOperand = ''
this.operation = undefined
}
delete() { //Removes the last digit from the current operand.
this.currentOperand = this.currentOperand.toString().slice(0, -1)
}
appendNumber(number) { //Appends a number or a decimal point to the current operand, preventing multiple decimal points.
if (number === '.' && this.currentOperand.includes('.')) return
this.currentOperand = this.currentOperand.toString() + number.toString()
}
chooseOperation(operation) { //sets the current based on the operation button onclick
if (this.currentOperand === '') return //If there is a current operand, it computes the result if there is also a previous operand.
if (this.previousOperand !== '') {
this.compute()
}
this.operation = operation
this.previousOperand = this.currentOperand
this.currentOperand = ''
}
compute() { //Performs operation using current and previous operands
let computation
const prev = parseFloat(this.previousOperand)
const current = parseFloat(this.currentOperand)
//Updates the current operand with the result.
if (isNaN(prev) || isNaN(current)) return
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 = ''
}
getDisplayNumber(number) { //Formats a number as a string for display, handling integer and decimal parts separately.
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
}
}
updateDisplay() { //Display current and previous operands
this.currentOperandTextElement.innerText =
this.getDisplayNumber(this.currentOperand)
if (this.operation != null) {
this.previousOperandTextElement.innerText =
`${this.getDisplayNumber(this.previousOperand)} ${this.operation}`
} else {
this.previousOperandTextElement.innerText = ''
}
}
}
//Reference to present the button on the calculator
//Selects HTML elements representing number buttons, operation buttons, equals button, delete button, clear button, and text elements for displaying operands.
const numberButtons = document.querySelectorAll('[data-number]')
const operationButtons = document.querySelectorAll('[data-operation]')
const equalsButton = 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]')
const calculator = new Calculator(previousOperandTextElement, currentOperandTextElement)
//The acceptedKeys array is used to filter out valid number keys (0-9).
acceptedKeys = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
window.addEventListener('keydown', function (e) {
if (e.key === 'Enter') { //The Enter key triggers the compute method to perform the calculation, and then the updateDisplay method is called to update the display.
calculator.compute();
calculator.updateDisplay();
} else if (e.key === 'Backspace') { //The Backspace key triggers the delete method to remove the last digit.
calculator.delete();
calculator.updateDisplay();
} else if (e.key === '*' || e.key === '/' || e.key === '+' || e.key === '-') {//The *, /, +, and - keys trigger the chooseOperation method to set the operation based on the pressed key.
calculator.chooseOperation(e.key);
calculator.updateDisplay();
} else if (!acceptedKeys.includes(e.key) && e.key !== '.') {
calculator.appendNumber(e.key);
calculator.updateDisplay();
}
});
//This loop iterates over each of the buttons and adds an event listener to handle the button click event.
numberButtons.forEach(button => {
button.addEventListener('click', () => {
calculator.appendNumber(button.innerText)
calculator.updateDisplay()
})
})
operationButtons.forEach(button => {
button.addEventListener('click', () => {
calculator.chooseOperation(button.innerText)
calculator.updateDisplay()
})
})
equalsButton.addEventListener('click', button => {
calculator.compute()
calculator.updateDisplay()
})
allClearButton.addEventListener('click', button => {
calculator.clear()
calculator.updateDisplay()
})
deleteButton.addEventListener('click', button => {
calculator.delete()
calculator.updateDisplay()
})