Last active
September 6, 2021 16:57
-
-
Save mota57/a45da46df6b7f71f8497cad5aa21d5b8 to your computer and use it in GitHub Desktop.
simple javascript calculator
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var PlainCalculator = (function() { | |
const ExpressionSide = { | |
LEFT: 0, | |
RIGHT:2 | |
}; | |
const ExpressionType = { | |
NUMBER: 0, | |
OPERAND: 1, | |
} | |
function ExpressionContent(val, type) { | |
this.val = val; | |
this.type = type; | |
} | |
function ExpressionMath(left,middle,right, next) { | |
this.left = left; | |
this.middle = middle; | |
this.right = right; | |
this.next = next; | |
} | |
function BuildTree(mathExpression) | |
{ | |
var mathExpArray = mathExpression.split(''); | |
var expContent = new ExpressionContent(null, null); | |
for(var i = 0; i < mathExpArray.length; i++) | |
{ | |
var val = mathExpArray[i]; | |
var expSide = ExpressionSide.LEFT; | |
if(expType === ExpressionSide.LEFT && isNumber(val)){ | |
expContent.val = val; | |
expContent. | |
} else if(isNull(operator) && isOperator(val)) | |
{ | |
} else if(expType === ExpressionSide.RIGHT && isNumber(val)){ | |
} else { | |
throw new Exception("ERROR NOT ABLE TO PROCESS"); | |
} | |
} | |
} | |
function ProcessExpression(mathExpression) { | |
var total = 0; | |
var mathExpArray = mathExpression.split(''); | |
var left = '', operator = null, right =''; | |
var expType = ExpressionSide.LEFT; | |
for(var i = 0; i < mathExpArray.length; i++) | |
{ | |
var val = mathExpArray[i]; | |
if(expType === ExpressionSide.LEFT && isNumber(val)){ | |
left += val; | |
} else if(isNull(operator) && isOperator(val)) | |
{ | |
operator = val; | |
expType = ExpressionSide.RIGHT; | |
} else if(expType === ExpressionSide.RIGHT && isNumber(val)){ | |
right += val; | |
} else { | |
throw new Exception("ERROR NOT ABLE TO PROCESS"); | |
} | |
// left OPERAND right | |
/* | |
if(isNumber(left) === true && isNumber(right) === true && isOperator(operator) === true) | |
{ | |
total = doMath(left, operator, right); | |
expType = ExpressionSide.LEFT; | |
left = ''; | |
operator = null; | |
right = ''; | |
} | |
*/ | |
} | |
return left; | |
} | |
function isNumber(val){ | |
return !isNull(val) && val !== "" && !isNaN(val); | |
} | |
function isNull(val){ | |
return val === null; | |
} | |
function isOperator(op){ | |
var is = false; | |
switch(op){ | |
case '+': | |
case '-': | |
case '/': | |
is = true; | |
break; | |
} | |
return is; | |
} | |
function doMath(l, op, r){ | |
console.log(l, op, r); | |
if(op === '+'){ | |
return Number(l) + Number(r); | |
} | |
if(op === '-') { | |
return Number(l) - Number(r); | |
} | |
if(op === '/') { | |
return Number(l) / Number(r); | |
} | |
throw new Exception(' no operator to apply'); | |
} | |
return { | |
'buildTree': buildTree, | |
'evaluate': ProcessExpression | |
} | |
})(); | |
/*EXAMPLE */ | |
PlainCalculator.evaluate('3+3'); //->9 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment