5+4-2+7*3/2 我要計算這個字串,先乘除后加減 不用eval怎么寫 各位大神給個思路。
uj5u.com熱心網友回復:
頂~!頂~!頂~!uj5u.com熱心網友回復:
(new Function("return 5+4-2+7*3/2"))();
uj5u.com熱心網友回復:
eval("var a = 5+4-2+7*3/2;")uj5u.com熱心網友回復:
大概像這樣
var expressionCalc = (function () {
var operatorTable;
operatorTable = {
'-': {
priority: 1,
handle: function (a, b) {
return a - b;
}
},
'+': {
priority: 1,
handle: function (a, b) {
return a + b;
}
},
'*': {
priority: 2,
handle: function (a, b) {
return a * b;
}
},
'/': {
priority: 2,
handle: function (a, b) {
return a / b;
}
}
};
function postfix(expression) {
var i, op, stack, output, n, char;
stack = [];
output = [];
//去空白
expression = expression.replace(/\s/g, '');
function getn() {
var n, c;
n = '';
while ((c = expression[i]) && /\w/.test(c)) {
n += c;
i++;
}
i--;
return n;
}
function popstack(tobrace) {
var o;
while (stack.length) {
if (tobrace) {
o = stack.pop();
if (o == '(') {
break;
}
output.push(o);
} else if (operatorTable[stack[stack.length - 1]] && operatorTable[stack[stack.length - 1]].priority >= op) {
output.push(stack.pop());
} else {
break;
}
}
}
for (i = 0; i < expression.length; i++) {
char = expression[i];
if (char == ")") {
popstack(true);
} else if (char == "(") {
stack.push(char);
} else if (operatorTable[char] && (op = operatorTable[char].priority)) {
popstack();
stack.push(char);
} else {
output.push(getn());
}
}
op = -1;
popstack();
return output;
}
function calcStack(stack) {
var n1, n2, r, output;
if (!stack.length) return;
output = [];
for (i = 0; i < stack.length; i++) {
n = stack[i];
if (operatorTable[n]) {
n2 = new Number(output.pop());
n1 = new Number(output.pop());
output.push(operatorTable[n].handle(n1, n2));
} else {
output.push(stack[i]);
}
}
return output[0];
}
return function (expression) {
return calcStack(postfix(expression));
}
})();
console.log(expressionCalc('5+4-2+7*3/2')); //17.5
uj5u.com熱心網友回復:
https://github.com/ougege/utils/blob/master/weCal.js 解決了多級括號和用戶連續輸入多個運算子轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/155474.html
標籤:JavaScript
