作者xxxx9659 (嘎嘎嘎嘎嘎)
看板Ajax
标题[问题] 利用 eval() 计算四则运算 & 次方运算
时间Tue Apr 2 17:03:29 2013
我想利用 eval() 计算四则运算,以及 Math.pow() 函数
以下是我的架构
var expr =
"(1 + 2) * pow(2, 3) ,haha@_@";
//(1 + 2)* pow(2, 3) ,haha@_@
expr = expr.replace(
/[^0-9a-z\.\+\-\*\/\(\)]/ig,
"");
//过滤掉特殊字元
//(1+2)*pow(2,3)haha
expr = expr.replace(
/(Math\.)?pow\(/ig,
"_");
//(1+2)*_2,3)haha
expr = expr.replace(
/[a-z]/ig,
"");
//(1+2)*_2,3)
expr = expr.replace(
/_/g,
"Math.pow(");
//将 pow() 正名为 Math.pow()
//(1+2)*Math.pow(2,3)
alert(
"output: " + eval(expr));
//output: 16
但是觉得使用 pow(a, b) 有点麻烦,希望用 a ^ b 来表示 a 的 b 次方
这样就要考虑优先权关系
要使得 ^ 运算元变成比乘、除还要优先,而且顺序是 由右向左 优先做的
例如下面两个 case 不一样
2 ^ 2 ^ 3 * 4 ^ 2
= Math.pow(2, Math.pow(2, 3)) * Math.pow(4, 2)
= 4096
(2 ^ 2) ^ 3 * 4 ^ 2
= Math.pow(Math.pow(2, 2), 3) * Math.pow(4, 2)
= 1024
这样变的很复杂,好像不能单纯用字串取代就可以解决
请问各位大大,这个问题有没有比较好的解决方法?
看在我着色精美的份上帮帮忙吧... m(_ _)m
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 210.66.250.52
3F:推 SansWord:这种需求得自己写parser了,jison看起来也太好用了吧!!! 04/08 01:29