[問題] 利用 eval() 計算四則運算 & 次方運算

看板Ajax作者 (嘎嘎嘎嘎嘎)時間12年前 (2013/04/02 17:03), 編輯推噓1(102)
留言3則, 2人參與, 最新討論串1/1
我想利用 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

04/02 17:34, , 1F
我好像找到答案了 http://goo.gl/pgF9d
04/02 17:34, 1F

04/02 17:35, , 2F

04/08 01:29, , 3F
這種需求得自己寫parser了,jison看起來也太好用了吧!!!
04/08 01:29, 3F
文章代碼(AID): #1HMfxasf (Ajax)
文章代碼(AID): #1HMfxasf (Ajax)