java解析并计算字符串算式
解析并计算,字符串形式的加减乘除算式,我亲测可行的,有一下两种方法:1.直接通过Java代码,采用递归,手动解析计算:参考如下连接:https://blog.csdn.net/qq_37969433/article/details/81174046核心代码也列在下面:/*** 判断表达式是不是只有一个数字** @param str 原值...
·
解析并计算,字符串形式的加减乘除算式,我亲测可行的,有以下两种方法:
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
更多推荐
所有评论(0)