Created
December 7, 2016 07:48
-
-
Save tiltedlistener/1c85482d66e8342b1b17c2ada055025c to your computer and use it in GitHub Desktop.
Parse math strings and solve
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 equation = "1+(3+(3-2))*5/2"; | |
var process = function(arr) { | |
if (arr.length == 1) { | |
return parseFloat(arr[0]); | |
} | |
var number = arr[0]; | |
var operator = arr[1]; | |
var slice = 2; | |
if (number == "(") { | |
var count = 1; | |
for (var i = 1; i < arr.length; i++) { | |
if (arr[i] == ")") count--; | |
if (arr[i] == "(") count++; | |
if (count == 0) break; | |
} | |
number = process(arr.slice(1, i)); | |
if (i + 1 == arr.length) { | |
return number; | |
} else { | |
operator = arr[i+1]; | |
arr.splice(0, i+2); | |
slice = 0; | |
} | |
} | |
if (operator == '*' || operator == "/") { | |
if (arr[slice+1] == '+' || arr[slice+1] == '-') { | |
if (operator == '*') { | |
number = number * arr[slice]; | |
} else { | |
number = number / arr[slice]; | |
} | |
operator = arr[slice+1]; | |
arr.splice(0, 2); | |
} else { | |
if (operator == '*') return parseFloat(number) * process(arr.slice(slice)); | |
else return parseFloat(number) / process(arr.slice(slice)); | |
} | |
} | |
if (operator == '-') { | |
return parseFloat(number) - process(arr.slice(slice)); | |
} else if (operator == '+') { | |
return parseFloat(number) + process(arr.slice(slice)); | |
} | |
}; | |
console.log(process(equation.split(''))); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment