add guided calculator class
This commit is contained in:
parent
cfb13f2812
commit
4f15f98a7b
1 changed files with 101 additions and 0 deletions
101
calculator.js
Normal file
101
calculator.js
Normal file
|
@ -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();
|
Loading…
Add table
Add a link
Reference in a new issue