java解析并计算字符串算式

解析并计算,字符串形式的加减乘除算式,我亲测可行的,有以下两种方法:

1. Java自带的,eval方法

代码如下:

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

    /**
     * 使用java eval 计算字符串表达式
     * @param str 字符串表达式
     * @return double 类型的结果
     */
    public static Double eval(String str) {

        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine se = manager.getEngineByName("js");
        Double result = null;

        try {
            result = Double.valueOf(se.eval(str).toString());
            if (result == null) {
                result = new Double(0);
            }
        } catch (ScriptException e) {
            e.printStackTrace();
        }
        return result;
    }

2. 递归,手动解析

核心代码:

    /**
     * 判断表达式是不是只有一个数字
     *
     * @param str 原值
     * @return 数字非法性校验结果,失败返回false;
     */
    private static boolean isNumber(String str) {

        for (int i = 0; i < str.length(); i++) {
            if (!Character.isDigit(str.charAt(i)) && str.charAt(i) != '.' && str.charAt(i) != ' ') {
                return false;
            }
        }
        return true;
    }

    /**
     * 解析算式,并计算算式结果;
     *
     * @param str 算式的字符串
     * @return double类型的算式结果
     */
    public static Double getResult(String str) {

        // 递归头
        if (str.isEmpty() || isNumber(str)) {
            return str.isEmpty() ? 0 : Double.parseDouble(str);
        }

        //递归体
        if (str.contains(")")) {
            // 最后一个左括号
            int lIndex = str.lastIndexOf("(");
            // 对于的右括号
            int rIndex = str.indexOf(")", lIndex);
            return getResult(str.substring(0, lIndex) + getResult(str.substring(lIndex + 1, rIndex)) + str.substring(rIndex + 1));
        }
        if (str.contains("+")) {
            int index = str.lastIndexOf("+");
            return getResult(str.substring(0, index)) + getResult(str.substring(index + 1));
        }
        if (str.contains("-")) {
            int index = str.lastIndexOf("-");
            return getResult(str.substring(0, index)) - getResult(str.substring(index + 1));
        }
        if (str.contains("*")) {
            int index = str.lastIndexOf("*");
            return getResult(str.substring(0, index)) * getResult(str.substring(index + 1));
        }
        if (str.contains("/")) {
            int index = str.lastIndexOf("/");
            return getResult(str.substring(0, index)) / getResult(str.substring(index + 1));
        }

        // 出错
        return null;
    }

参考如下连接:https://blog.csdn.net/qq_37969433/article/details/81174046

你可能感兴趣的:(cnCommdata,java技术,程序员)