将数学字符串转换为int

时间:2010-07-15 06:09:12

标签: java math operators

是否有一种简单的方法可以使用诸如“5 * 4”之类的字符串并返回20?

11 个答案:

答案 0 :(得分:6)

最简单的方法是使用JRE 6标准API提供的Rhino JavaScript engine

编辑根据评论,如果字符串是用户提供的,这可能是一个潜在的安全漏洞。一定要过滤除数字,大括号和数学运算符以外的所有内容。

答案 1 :(得分:3)

您可能正在寻找类似JbcParser - Math Parser for Java的内容。

答案 2 :(得分:3)

我不知道哪些是最好的,但有“数学表达式评估器”包。

查看Java Math Expression Evaluator(包含one file源代码)

网站使用示例:

  

java -cp meval.jar   com.primalworld.math.MathEvaluator   -cos(0)*(1 + 2)
  java -cp meval.jar com.primalworld.math.MathEvaluator   0.05 * 200 + 3.01

答案 3 :(得分:2)

有关表达评估的更多详细信息,请访问:

Algorithms in Java, Volume 1, Parts 1-4

答案 4 :(得分:2)

我搜索了一下,发现一个here。它不完全是你所需要的,但也许它有助于实现这一点。

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class ScriptDemo {

    public static void main(String[] args) {

        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("js");

        engine.put("a", 1);
        engine.put("b", 2);

        try {
            String expression = "(a + b) > 2";
            Object result = engine.eval(expression);
            System.out.println(expression+" ? "+result);
        } catch(ScriptException se) {
            se.printStackTrace();
        }
    }
}

答案 5 :(得分:2)

听起来你应该看看JEXL(Java表达式语言)

非常易于使用;例如,您的问题的解决方案是:

  public static void main(String[] args) {
    long a = 5;
    long b = 4;
    String theExpression = "a * b";
    JexlEngine jexl = new JexlEngine();
    Expression e = jexl.createExpression(theExpression);
    JexlContext context = new MapContext();
    context.set("a", a);
    context.set("b", b);
    Long result = (Long) e.evaluate(context);
    System.out.println("The answer : " + result);
  }

或者,如果直接读取字符串,则可以使用以下内容:

 public static void main(String[] args) {
   JexlEngine jexl = new JexlEngine();
   Expression e = jexl.createExpression("5 * 4");
   Integer result = (Integer) e.evaluate(null);
   System.out.println("The answer : " + result);
 }

答案 6 :(得分:1)

最好使用图书馆。 Janino能够评估任意Java表达式,例如您指定的Java表达式,以及更多。

查看ExpressionEvaluator示例。

答案 7 :(得分:1)

您可以尝试使用Integer.parseInt()并使用switch()语句自行解析它来查找运算符。

您也可以尝试使用javax.script.ScriptEngine;有关详细信息,请参阅http://forums.sun.com/thread.jspa?threadID=5144807

答案 8 :(得分:1)

您也可以使用BeanShell 它实际上是一个Java源代码解释器,但最近我用它来评估一些包含变量的表达式(只有eval方法使用BeanShell, rest 用于准备输出):< / p>

import bsh.EvalError;
import bsh.Interpreter;

public class EVAL {

    private static final String FORMAT = "%-5s | %-5s | %-5s | %s%n";

    public static void main(String[] args) {
        tabela("((a && b)||c)");
        tabela("a ? (b || c) : (b && c)");
        tabela("(a?1:0) + (b?1:0) + (c?1:0) >= 2");
    }

    private static void tabela(String expressao) {
        System.out.printf(FORMAT, "  a  ", "  b  ", "  c  ", expressao);
        System.out.printf(FORMAT, "-----", "-----", "-----", expressao.replaceAll(".", "-"));
        try {
            for (int i = 0; i < 8; i++) {
                boolean a = (i & (1<<2)) != 0;
                boolean b = (i & (1<<1)) != 0;
                boolean c = (i & (1<<0)) != 0;
                boolean r = eval(expressao, a, b, c);
                System.out.printf(FORMAT, a, b, c, r);
            }
        } catch (EvalError ex) {
            ex.printStackTrace();
        }
        System.out.println();
        System.out.println();
    }

    private static boolean eval(String expressao, boolean a, boolean b, boolean c) throws EvalError {
        Interpreter inter = new Interpreter();
        inter.set("a", a);
        inter.set("b", b);
        inter.set("c", c);
        Object resultado = inter.eval(expressao);
        return (Boolean) resultado;
    }
}

结果:

  a   |   b   |   c   | ((a && b)||c)
----- | ----- | ----- | -------------
false | false | false | false
false | false | true  | true
false | true  | false | false
false | true  | true  | true
true  | false | false | false
true  | false | true  | true
true  | true  | false | true
true  | true  | true  | true


  a   |   b   |   c   | a ? (b || c) : (b && c)
----- | ----- | ----- | -----------------------
false | false | false | false
false | false | true  | false
false | true  | false | false
false | true  | true  | true
true  | false | false | false
true  | false | true  | true
true  | true  | false | true
true  | true  | true  | true


  a   |   b   |   c   | (a?1:0) + (b?1:0) + (c?1:0) >= 2
----- | ----- | ----- | --------------------------------
false | false | false | false
false | false | true  | false
false | true  | false | false
false | true  | true  | true
true  | false | false | false
true  | false | true  | true
true  | true  | false | true
true  | true  | true  | true

答案 9 :(得分:1)

我过去曾使用JEval,并且发现它非常简单直观。这是一段代码:

import net.sourceforge.jeval.EvaluationException;
import net.sourceforge.jeval.Evaluator;

public class Main {
    public static void main(String[] args) {
        try {
            System.out.println(new Evaluator().evaluate("5+4*3"));
        }
        catch (EvaluationException e) {
            e.printStackTrace();
        }
    }
}

答案 10 :(得分:0)

还有这一个:

https://eval.dev.java.net/