JAVA使用JEP进行公式计算
1.场景描述
在工作中有遇到需要在页面编辑公式,需要后台进行计算,公式中涉及到项目中的基础数据测点,计算时需要动态的替换到测点数据,对公式进行计算得出结果。
2.分析处理
2.1结合场景,使用JEP进行计算,引入依赖
<dependency>
<groupId>jep</groupId>
<artifactId>jep</artifactId>
<version>2.24</version>
</dependency>
2.2编写testCase类进行测试
public class TestCase {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入计算公式:");
JEP jep = new JEP(); //一个数学表达式
String exp = scanner.nextLine(); //给变量赋值
//去掉公式中的括号
exp = exp.replaceAll("\\(|\\)", "");
//对公式进行分割,去掉符号
String[] expArray = exp.split("[-+*/^]|(>=)|(>)|(<=)|(<)|(==)|(!=)|[&|]{2}");
System.out.println("---去掉符合的集合expArray---:"+JSON.toJSON(expArray));
List<String> stringList = new ArrayList<>();
for(int i = 0;i<expArray.length;i++){
String s = expArray[i];
//过滤掉判断的纯数字值的,仅保留下测点
if(!s.matches("^(\\-|\\+)?\\d+(\\.\\d+)?$")){
if(!stringList.contains(s)){
stringList.add(s);
}
}
}
System.out.println("---变量集合stringList---:"+JSON.toJSON(stringList));
char[] stringArr = exp.toCharArray();
List<String> list = new ArrayList<>();
for (int i = 0; i < stringArr.length; i++) {
char c = stringArr[i];
//char本质是ACSII码,与数字比较
if (c >= 97 && c <= 122) {
String s = String.valueOf(c);
if(!list.contains(s)) {
list.add(s);
}
}
}
List<Character> variableList = getRandomCharacters(stringList.size());
for (int i = 0; i < stringList.size(); i++) {
System.out.println("请对 " + stringList.get(i) + "进行赋值:");
float temp = scanner.nextFloat();
//为变量赋值
String x =variableList.get(i).toString();
jep.addVariable(x, temp);
//替换公式中的变量
exp = exp.replace(stringList.get(i),x);
}
//计算
jep.parseExpression(exp);
//获得结果,如果是需要判断正确的公式,返回的结果是1.0表示true,0.0表示false
Object result = jep.getValue();
System.out.println("---计算结果---: " + result);
}
public static List<Character> getRandomCharacters(int count) {
if(count<=0 || count>26) {
return null;
}
int baseNumber = 97;
Random random = new Random();
List<Character> result = new ArrayList<Character>();
while(result.size() < count) {
int number = random.nextInt(26);
char chr = (char)(baseNumber + number);
if(!result.contains(chr)) {
result.add(chr);
}
}
return result;
}
}
3.验证结果
实际可根据情况进行处理修改逻辑,此部分仅供参考。