说我有这样的字符串:'1 + 2 + 3 * 4'
是否可以从左到右计算(顺序?线性?),使其等于24且不 15?
我不知道前面的字符串是什么,所以它可能是'1 + 2'或者它可能是'1 + 7 * 11 - 18/32 * 155'
答案 0 :(得分: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)
循环仍假定为奇数长度数组,以Number(作为String)开头。
答案 1 :(得分:1)
单行:
result = str.match(/\D*\d+/g).reduce(function(r, e) { return eval(r + e) })
答案 2 :(得分:0)
通常只需插入括号。
但是如果由于某种原因你不能这样做,你可以按操作符分割字符串,然后为每个字符串评估previous_part + next_part
。
这是一个非常简单的例子:
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);