diff --git a/calculator.js b/calculator.js new file mode 100644 index 0000000..4bf65a1 --- /dev/null +++ b/calculator.js @@ -0,0 +1,101 @@ +class Calculator { + result = 0; + expression = []; + + #config; + + /* + Perform a calculation. + */ + calculate(parameters) { + this.input = this.expression.join(``); + + // Evaluate. + try { + this.result = eval(this.input); + delete this.input; + + if (this.result === Infinity || this.result === NaN) { + throw new Error(undefined); + } + + return (this.result); + } catch(err) { + alert(err); + return(err); + }; + }; + + /* + Execute special functions. + + @param {string} operation The function name to execute. + @param {string} passthrough The value to pass through. + */ + run (operation, passthrough) { + if ((operation) ? operation.trim() : false) { + switch (operation) { + case `AC`: + this.expression = []; + break; + case `=`: + this.result = this.calculate((passthrough) ? passthrough : this.expression); + this.expression = [this.result]; + break; + default: + break; + }; + }; + } + + /* + Allow the users to input data. + */ + interactive() { + while (true) { + this.input = prompt((this.expression.length) ? this.expression.join(` `) : `0`); + + // Input number first. Usually, this can be determined if the number length is the same as the operand length. + if ((this.input) ? this.input.trim() : false) { + this.input = this.input.trim(); + + if ((this.#config[`operands`].includes(this.input)) || (!(this.#config[`functions`].includes(this.input)))) { + if (!((this.#config[`operands`].includes(this.input)) || (this.#config[`order`].includes(this.input)))) { + try { + this.input = parseFloat(this.input); + } catch(err) {}; + }; + + // Check if the last item is an operand. + if ((this.expression.length && (!(this.#config[`order`].includes(this.input)))) ? (((typeof this.input).includes(`number`)) ? ((typeof this.expression[this.expression.length - 1]).includes(`number`)) : this.#config[`operands`].includes(this.expression[this.expression.length - 1])) : false) { + this.expression[this.expression.length - 1] = this.input; + } else { + this.expression.push(this.input); + }; + + } else if (this.#config[`functions`].includes(this.input)) { + this.run(this.input); + } + } else { + break; + } + + delete this.input; + } + } + + constructor() { + this.#config = {}; + this.#config[`operands`] = [`+`, `-`, `*`, `/`, `%`, `^`]; + this.#config[`order`] = [`(`, `)`]; + this.#config[`functions`] = [`AC`, `=`]; + }; +}; + + +function main() { + let INSTANCE = new Calculator(); + INSTANCE.interactive(); +}; + +main();