2010-03-10 30 views
1

我試圖做一個JavaScript函數,將一個數學表達式,並把它應用到預定數量的運行的數學表達式,例如:如何檢查和使用Javascript

var myNum = 10; 

function EQ(eq){ 
// code here 
} 

例如,輸入應我這樣的事情:

EQ("*100/10"); //output 100 
EQ("+100"); //output will be 110 
EQ("-+=1"); //output false 

有沒有什麼辦法可以做到這一點? 謝謝

+2

jQuery不會幫你在這裏。 – Gumbo 2010-03-10 23:11:30

+0

jQuery和這有什麼關係? – Tin 2010-07-08 02:33:38

+0

對於未來讀者想知道與錫相同的東西,jQuery是原始標題和標籤的一部分。 – 2013-09-09 20:36:39

回答

5

你或許可以將eval()工作成一個簡單的解決方案。例如:

var myNum = 10; 

function EQ(eq) { return eval(myNum+eq); } 

alert(EQ("*100/10")); // outputs 100 

我鼓勵您通過實施try-catch並處理異常來擴展此。

+0

非常感謝,但EQ(「100/10」); //輸出1010 //如何輸出錯誤? – trrrrrrm 2010-03-10 23:25:56

+1

@ From.ME你在這裏改變我的語法。你所有的例子都以一個運算符開始,並傳遞給'EQ()'。在您提供的數據中,在我的解決方案中,假設第一個字符將始終(不變)作爲運算符。如果你傳入「100/10」,則評估的表達式將是「10100/10」,即「1010」。 – Sampson 2010-03-10 23:27:40

+0

關於錯誤處理,這裏有一些關於Javascript中的Try ... Catch的信息:http://www.w3schools.com/js/js_try_catch.asp – Sampson 2010-03-10 23:31:03

0

試試這個...

function EQ(input) { 
    try { 
    var ret = Number(eval('(0+(' + input + '))')); 
    return isNaN(ret) ? null : ret; 
    } catch(err) { 
    } 
    return null; 
}

您可以替換,如果你喜歡一個文字錯誤空默認...

1

這裏有一個簡單的表達式求值:

function evalExpression(text) 
{ 
    var tokens = text.split(" "); 

    var output = []; 
    var operators = []; 

    var reNumber = /^\d+(\.\d+)?$/; 
    var reOperator = /^[\/\+\*\-]$/; 
    var precedence = { "+": 1, "-": 1, "*": 2, "/": 2 }; 

    for (var i = 0; i < tokens.length; ++i) 
    { 
    var t = tokens[i]; 
    if (reNumber.test(t)) 
     output.push(Number(t)); 
    else if (reOperator.test(t)) 
    { 
     while (operators.length && precedence[t] <= precedence[operators[operators.length - 1]]) 
     { 
     output.push(operators.pop()); 
     } 

     operators.push(t); 
    } 
    else if (t == "(") 
     operators.push(t); 
    else if (t == ")") 
    { 
     while (operators.length && operators[operators.length - 1] != "(") 
     output.push(operators.pop()); 

     if (!operators.length) return false; 

     operators.pop();  
    } 
    else 
     return false; 
    } 

    while (operators.length) 
    output.push(operators.pop()); 

    var result = []; 

    for (i = 0; i < output.length; ++i) 
    { 
    t = output[i]; 
    if (reNumber.test(t)) 
     result.push(t); 
    else if (t == "(" || result.length < 2) 
     return false; 
    else 
    { 
     var lhs = result.pop(); 
     var rhs = result.pop(); 

     if (t == "+") result.push(lhs + rhs); 
     if (t == "-") result.push(lhs - rhs); 
     if (t == "*") result.push(lhs * rhs); 
     if (t == "/") result.push(lhs/rhs); 
    } 
    } 

    return result.pop(); 
} 

它支持號碼和+ - */()。令牌必須由一個空格分隔,例如:「1 *(2 + 3)」

無論如何,如果您不想使用eval,那麼這就是您需要的代碼類型。