Предполагая, что вы начинаете с числом и пространств только (и всегда) происходят между числами и операторами, можно разделить строку и передать его через объект определенных операторов
var num_eval = (function() {
var ops = {
'+': function (x, y) {return x + y},
'-': function (x, y) {return x - y},
'*': function (x, y) {return x * y},
'/': function (x, y) {return x/y}
// etc..
};
return function (str_command) {
var str_arr = str_command.split(' '),
lhs = +str_arr[0], i = 1; // + to cast Number
for (; i < str_arr.length; i = i + 2) {
lhs = ops[str_arr[i]](lhs, +str_arr[i+1]); // + to cast Number
}
return lhs;
};
}());
num_eval('1 + 2 + 3 * 4'); // 24
num_eval('1 + 7 * 11 - 18/32 * 155'); // 339.0625
Если вы хотите быть немного более расслабленным о форматировании строки, то вы можете использовать следующую RegExp.
str_arr = str_command.match(/([\+\-\*\/]|[\d]*[\.e]?[\d]+)/g)
Петля все еще принимает массив нечетной длины, начиная с номера (в виде строки).
..why нет скобка? '(1 + 2 + 3) * 4' –
Ну, это было первое, что я, конечно же, подумал, но, как правильно разместить их? Что, если это второй пример строки, и мне нужно больше 1 набора круглых скобок? – danwellman
Проверка разбора деревьев: http://stackoverflow.com/questions/2705727/generate-syntax-tree-for-simple-math-operations –