Java从字符串中解决数学运算

时间:2016-05-19 18:20:16

标签: java math

我在Java中有一项奇怪的任务。 不使用任何循环和if语句我必须开发简单的计算器,它在一个字符串中定义所有操作和数字,如:“126.7214 + 121” 我使用正则表达式来解析字符串并获得3个字符串变量['125.7214','+','121'],通常我会做if语句,parseString为整数,并且if if语句基于数学符号来对这些数字求和,但是我倾斜。 Java中有什么技巧可以更快地完成它吗?一些准备好的图书馆? 我很感激任何建议。 :代码:

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class Calc {

    public String doCalc(String cmd) {

        Matcher m = Pattern.compile("\\S+").matcher(cmd);
        m.find();
        String num1= m.group(0);
        m.find();
        String znak = m.group(0);
        m.find();
        String num2 = m.group(0);





        return result;
    }
}  

4 个答案:

答案 0 :(得分:3)

JavaScript解析器适用于表达式。

import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
public class Expression{
  public static void main(String[] args){
    ScriptEngineManager script = new ScriptEngineManager();
    ScriptEngine eng = mgr.getEngineByName("JavaScript");
    System.out.println(eng.eval("5+5*5"));
    } 
}

答案 1 :(得分:2)

如果您不允许使用开关和外壳,则可以使用可以帮助您的库:

  • EvalEx - 我个人喜欢这个。
  • JEval
  • Commons Math:Apache Commons数学库

另外,你可以实施波兰计算器

答案 2 :(得分:0)

您可以使用Spring的SPeL来评估您的价值观。 SPeL代表Spring Expression Language。它允许您评估用Java编写的String。以下行是您可以在表达式中评估的示例。我想你可以简单地将你的值放在表达式中以获得值。当然,这并不是完全适用于所有依赖项。这个例子只是向您展示一个简单的示例,向您展示它。

//From www.mkyong.com
Expression exp2 = parser.parseExpression("'Hello World'.length()");

当然,您可以参考Spring站点,以了解有关如何使用依赖项创建Spring项目以及完全刷新的几个示例的更多信息。我从mkyong网站收到了这个小片段。

http://www.mkyong.com/spring3/test-spring-el-with-expressionparser/

答案 3 :(得分:0)

这是一种利用多态的方法(因为你已经知道如何解析操作数,因为我本人的懒惰,我已经把那部分留下了):

import java.util.*;

public class CalcProofOfConcept {

    public static abstract class Arithmetic { public abstract double apply(double x, double y); }

    public static class Add extends Arithmetic { public double apply(double x, double y) { return x+y; } }
    public static class Subtract extends Arithmetic { public double apply(double x, double y) { return x-y; } }
    public static class Multiply extends Arithmetic { public double apply(double x, double y) { return x*y; } }
    public static class Divide extends Arithmetic { public double apply(double x, double y) { return x/y; } }

    public static void main(String []args){
        Map<String, Arithmetic> operators = new HashMap<String, Arithmetic>();
        operators.put("+", new Add());
        operators.put("-", new Subtract());
        operators.put("*", new Multiply());
        operators.put("/", new Divide());

        double x = 125.7214;
        double y = 121;
        String op = "+";

        System.out.println(operators.get(op).apply(x,y));
    }
}

这会打印246.72140000000002

顺便说一句:实际的算术表达式是context-free language,因此除了最简单的表单之外,使用正则表达式解析它们将不起作用。例如,一旦混合加法和乘法,基于正则表达式的计算器就会给出错误的结果,因为它不能尊重运算符优先级。

PS:是的,我知道这是用大锤打破坚果但是我觉得这样做很酷...