Skip to content

Instantly share code, notes, and snippets.

@tiltedlistener
Created December 7, 2016 07:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tiltedlistener/1c85482d66e8342b1b17c2ada055025c to your computer and use it in GitHub Desktop.
Save tiltedlistener/1c85482d66e8342b1b17c2ada055025c to your computer and use it in GitHub Desktop.
Parse math strings and solve
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