Spaces:
Running
Running
| class Calculator { | |
| constructor(previousOperandElement, currentOperandElement) { | |
| this.previousOperandElement = previousOperandElement; | |
| this.currentOperandElement = currentOperandElement; | |
| this.clear(); | |
| } | |
| clear() { | |
| this.currentOperand = '0'; | |
| this.previousOperand = ''; | |
| this.operation = undefined; | |
| this.resetNextInput = false; | |
| } | |
| delete() { | |
| if (this.resetNextInput) return; | |
| this.currentOperand = this.currentOperand.toString().slice(0, -1); | |
| if (this.currentOperand === '') { | |
| this.currentOperand = '0'; | |
| } | |
| } | |
| appendNumber(number) { | |
| if (this.resetNextInput) { | |
| this.currentOperand = '0'; | |
| this.resetNextInput = false; | |
| } | |
| if (number === '.' && this.currentOperand.includes('.')) return; | |
| if (this.currentOperand === '0' && number !== '.') { | |
| this.currentOperand = number.toString(); | |
| } else { | |
| this.currentOperand = this.currentOperand.toString() + number.toString(); | |
| } | |
| } | |
| chooseOperation(operation) { | |
| if (this.currentOperand === '') return; | |
| if (this.previousOperand !== '') { | |
| this.calculate(); | |
| } | |
| this.operation = operation; | |
| this.previousOperand = this.currentOperand; | |
| this.resetNextInput = true; | |
| } | |
| calculate() { | |
| let computation; | |
| const prev = parseFloat(this.previousOperand); | |
| const current = parseFloat(this.currentOperand); | |
| 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 '÷': | |
| if (current === 0) { | |
| computation = 'Error'; | |
| } else { | |
| computation = prev / current; | |
| } | |
| break; | |
| case '%': | |
| computation = prev % current; | |
| break; | |
| default: | |
| return; | |
| } | |
| this.currentOperand = computation.toString(); | |
| this.operation = undefined; | |
| this.previousOperand = ''; | |
| this.resetNextInput = true; | |
| } | |
| getDisplayNumber(number) { | |
| if (number === 'Error') return 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; | |
| } | |
| } | |
| updateDisplay() { | |
| this.currentOperandElement.innerText = this.getDisplayNumber(this.currentOperand); | |
| if (this.operation != null) { | |
| this.previousOperandElement.innerText = | |
| `${this.getDisplayNumber(this.previousOperand)} ${this.operation}`; | |
| } else { | |
| this.previousOperandElement.innerText = ''; | |
| } | |
| } | |
| } | |
| // Initialize calculator | |
| const previousOperandElement = document.getElementById('previous-operand'); | |
| const currentOperandElement = document.getElementById('current-operand'); | |
| const calculator = new Calculator(previousOperandElement, currentOperandElement); | |
| // Event listeners | |
| document.querySelectorAll('[data-number]').forEach(button => { | |
| button.addEventListener('click', () => { | |
| calculator.appendNumber(button.getAttribute('data-number')); | |
| calculator.updateDisplay(); | |
| }); | |
| }); | |
| document.querySelectorAll('[data-operation]').forEach(button => { | |
| button.addEventListener('click', () => { | |
| calculator.chooseOperation(button.getAttribute('data-operation')); | |
| calculator.updateDisplay(); | |
| }); | |
| }); | |
| document.querySelector('[data-action="calculate"]').addEventListener('click', () => { | |
| calculator.calculate(); | |
| calculator.updateDisplay(); | |
| }); | |
| document.querySelector('[data-action="clear"]').addEventListener('click', () => { | |
| calculator.clear(); | |
| calculator.updateDisplay(); | |
| }); | |
| document.querySelector('[data-action="delete"]').addEventListener('click', () => { | |
| calculator.delete(); | |
| calculator.updateDisplay(); | |
| }); | |
| // Keyboard support | |
| document.addEventListener('keydown', event => { | |
| if (event.key >= 0 && event.key <= 9) { | |
| calculator.appendNumber(event.key); | |
| calculator.updateDisplay(); | |
| } | |
| if (event.key === '.') { | |
| calculator.appendNumber('.'); | |
| calculator.updateDisplay(); | |
| } | |
| if (event.key === '+' || event.key === '-' || event.key === '*' || event.key === '/') { | |
| let op = event.key; | |
| if (op === '*') op = '×'; | |
| if (op === '/') op = '÷'; | |
| calculator.chooseOperation(op); | |
| calculator.updateDisplay(); | |
| } | |
| if (event.key === '%') { | |
| calculator.chooseOperation('%'); | |
| calculator.updateDisplay(); | |
| } | |
| if (event.key === 'Enter' || event.key === '=') { | |
| calculator.calculate(); | |
| calculator.updateDisplay(); | |
| } | |
| if (event.key === 'Escape') { | |
| calculator.clear(); | |
| calculator.updateDisplay(); | |
| } | |
| if (event.key === 'Backspace') { | |
| calculator.delete(); | |
| calculator.updateDisplay(); | |
| } | |
| }); |