diff --git a/index.html b/index.html index f7d984f..3252c75 100644 --- a/index.html +++ b/index.html @@ -47,6 +47,6 @@ - + \ No newline at end of file diff --git a/script.js b/script.js index 1b069cc..f01ad11 100644 --- a/script.js +++ b/script.js @@ -3,6 +3,7 @@ const topScreen = document.querySelector(".top-screen"); const buttons = document.querySelectorAll("button"); const operators = ["+", "-", "*", "/"]; let inOps = false; +let isEval = false; buttons.forEach((button) => { @@ -11,13 +12,20 @@ buttons.forEach((button) => { function displayToScreen() { - console.log(inOps); + console.log("inOps:", inOps); + console.log("isEval:", isEval); if (this.className == "equal") { let calc = new Calculator; inOps = true; - topScreen.textContent += mainScreen.textContent; + if (isEval) { + topScreen.textContent = mainScreen.textContent; + isEval = false; + } else { + topScreen.textContent += mainScreen.textContent; + } + mainScreen.textContent = calc.calculate(topScreen.textContent); } else if (this.classList.contains("all")) { @@ -38,8 +46,15 @@ function displayToScreen() { } else { if (this.className == "operator") { let screenContent = topScreen.textContent; - topScreen.textContent += mainScreen.textContent + " " + this.textContent + " "; inOps = true; + + if (isEval) { + topScreen.textContent = mainScreen.textContent + " " + this.textContent + " " + isEval = false + } else { + topScreen.textContent += mainScreen.textContent + " " + this.textContent + " "; + } + // Add some logic for handling negatives with - // Add key support // limit character size in mainScreen -- first step is to move numbers from the main mainScreen to somewhere else every time a new operator is used and then change what gets sent to the calculator to that new location @@ -47,7 +62,7 @@ function displayToScreen() { for (let i = 0; i < screenContent.length; i++ ) { if (operators.includes(screenContent[i])) { let calc = new Calculator; - result = calc.calculate(topScreen.textContent); + let result = calc.calculate(topScreen.textContent); mainScreen.textContent = result; break; } @@ -106,6 +121,7 @@ function divideDecimals(a, b) { function Calculator(str) { console.log("Calculator has been called") + isEval = true; this.methods = { "-": (a, b) => addDecimals(a, -b), diff --git a/script2.js b/script2.js new file mode 100644 index 0000000..74be222 --- /dev/null +++ b/script2.js @@ -0,0 +1,133 @@ +const mainScreen = document.querySelector(".main-screen"); +const topScreen = document.querySelector(".top-screen"); +const numButtons = document.querySelectorAll(".num"); +const equalButton = document.querySelector(".equal"); +const opButtons = document.querySelectorAll(".operator"); +const clearButtons = document.querySelectorAll(".clear"); +const operators = ["+", "-", "*", "/"]; +let inOps = false; +let isEval = false; + + +numButtons.forEach((button) => { + button.addEventListener("click", displayNum); +}); + +opButtons.forEach((button) => { + button.addEventListener("click", displayOperator); +}); + +clearButtons.forEach((button) => { + button.addEventListener("click", clear); +}); + +equalButton.addEventListener("click", displayEval); + + +function displayEval() { + console.log(this.textContent); + +} + + +function displayOperator() { + console.log(this.textContent); +} + + +function displayNum() { + console.log(this.textContent); +} + + +function clear() { + console.log(this.textContent); + + if (this.classList.contains("all")) { + mainScreen.textContent = "0"; + topScreen.textContent = ""; + + } else if (this.classList.contains("error") && mainScreen.textContent !== "0") { + mainScreen.textContent = mainScreen.textContent.trimEnd() + mainScreen.textContent = mainScreen.textContent.slice(0, -1); + + if (!isNaN(mainScreen.textContent.charAt(-2))) { + mainScreen.textContent = mainScreen.textContent.trimEnd() + } + + if (mainScreen.textContent === "") { + mainScreen.textContent = "0" + } + } +} + + +function addDecimals(a, b) { + a = String(a); + b = String(b); + + const adec = (a.split(".")[1] || "").length; + const bdec = (b.split(".")[1] || "").length; + const maxDec = Math.max(adec, bdec); + let divdec = "1"; + divdec = divdec.padEnd(maxDec, "0"); + + return ((+a * divdec + +b * divdec) / divdec).toFixed(maxDec); +} + + +function multiplyDecimals(a, b) { + a = String(a); + b = String(b); + + const adec = (a.split(".")[1] || "").length; + const bdec = (b.split(".")[1] || "").length; + const totalDec = adec + bdec; + + return (a * b).toFixed(totalDec) +} + + +function divideDecimals(a, b) { + a = String(a); + b = String(b); + + const adec = (a.split(".")[1] || "").length; + const bdec = (b.split(".")[1] || "").length; + const maxDec = Math.max(adec, bdec); + const divisor = Math.pow(10, maxDec); + + return(a * divisor) / (b * divisor); +} + + +function Calculator(str) { + console.log("Calculator has been called") + isEval = true; + + this.methods = { + "-": (a, b) => addDecimals(a, -b), + "+": (a, b) => addDecimals(a, b), + "/": (a, b) => divideDecimals(a, b), + "*": (a, b) => multiplyDecimals(a, b) + }; + + this.calculate = function(str) { + let parts = str.split(" "); + a = +parts[0]; + op = parts[1]; + b = +parts[2]; + + + if ((a || a == "0") && !b) { + return a; + } + if (isNaN(a) || isNaN(b)) { + return NaN; + } + if (!this.methods[op]) { + return "Operation not supported." + } + return this.methods[op](a, b); + }; +} \ No newline at end of file