2010-03-10 42 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,那么这就是您需要的代码类型。