0

只是说我有一个这样的字符串:'1 + 2 + 3 * 4'

是否可以从左到右(按顺序?线性?)计算它,使其等于 24 而不是15 ?

我事先不知道字符串是什么,所以它可能是 '1 + 2' 或者它可能是 '1 + 7 * 11 - 18 / 32 * 155'

4

3 回答 3

1

单线:

result = str.match(/\D*\d+/g).reduce(function(r, e) { return eval(r + e) })
于 2013-04-27T10:53:06.100 回答
1

假设您以数字开头,并且在数字和运算符之间仅(并且总是)出现空格,您可以拆分字符串并将其传递给已定义运算符的对象

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)

循环仍然假定一个奇数长度的数组,从一个数字(作为字符串)开始。

于 2013-04-27T09:56:18.190 回答
0

Usually you just insert parenthesis.

But if by some reason you cannot do that, you can split the string by operators and then evaluate previous_part + next_part for each of them.

Here's a super simple example:

var string_to_calculate = '1 + 2 + 3 * 4'
var parts = string_to_calculate.split(' ');
var result = parts[0];

for (var i = 1; i < parts.length - 1; i += 2) {
    result = eval(result + parts[i] + parts[i + 1]);
}

alert(result);
于 2013-04-27T09:51:51.140 回答