Java如何计算含运算符、百分号、括号的数学表达式,exp4j括号场景失效
Java 含括号、百分号的数学表达式计算问题
我需要计算包含算术运算符、百分号和括号的数学表达式。
示例:expressionString = 200+10%+(50+100%)%,预期输出结果为440。
我当前使用exp4j库处理数学表达式,该库遵循BODMAS规则计算,但没有内置百分号运算支持,因此我需要自行实现相关逻辑,尝试的代码如下:
Expression expression; String newExpr = "", exprResult = ""; String[] ar; if (calHelper.containsScientific(expressionString)) { ar = expressionString.split("(?<=[-+])|(?=[-+])"); //按运算符拆分表达式 } else { ar = expressionString.split("(?<=[-+()])|(?=[-+()])"); //按运算符拆分表达式 //ar = expressionString.split("(?<=[-+])|(?=[-+])"); //按运算符拆分表达式 } for (int i = 0; i < ar.length; i++) { System.out.println("exp: "+ar[i]); try { if (ar[i].indexOf('%') < 0) { newExpr += ar[i]; expression = evaluateExpression(newExpr, radDeg.getText().toString()); ValidationResult res = expression.validate(); if (res.isValid()) { double result = expression.evaluate(); exprResult = calHelper.withNoTrailingZeros(result); newExpr = exprResult; } } else { //如果表达式中有百分数的加减运算,则基于已计算的结果算百分比,其他运算符取1%值即数值/100 //如果%后没有第二个操作数,则不做额外计算,按exp4j原有逻辑处理 int preIndex = i - 1, nextIndex = i + 1; String prevOp, nextOp; prevOp = preIndex > -1 ? ar[preIndex] : ""; nextOp = nextIndex < ar.length ? ar[nextIndex] : ""; String perNo = ar[i].replace("%", ""); if (!exprResult.isEmpty() && calHelper.isNumeric(perNo) && calHelper.percentNoSecondOperand(ar[i]) && calHelper.allowPercentCal(prevOp, nextOp)) { newExpr += exprResult + '%' + perNo; expression = evaluateExpression(newExpr, radDeg.getText().toString()); ValidationResult res = expression.validate(); if (res.isValid()) { double result = expression.evaluate(); newExpr = calHelper.withNoTrailingZeros(result); exprResult = newExpr; } } else if (calHelper.percentNoSecondOperand(ar[i]) && calHelper.allowOnePercentCal(perNo, prevOp, nextOp)) { newExpr += ar[i].replaceAll("%", "%1"); expression = evaluateExpression(newExpr, radDeg.getText().toString()); ValidationResult res = expression.validate(); if (res.isValid()) { double result = expression.evaluate(); newExpr = calHelper.withNoTrailingZeros(result); exprResult = newExpr; } } else { newExpr += ar[i]; expression = evaluateExpression(newExpr, radDeg.getText().toString()); ValidationResult res = expression.validate(); if (res.isValid()) { double result = expression.evaluate(); newExpr = calHelper.withNoTrailingZeros(result); exprResult = newExpr; } } } } catch (Exception e) { e.getStackTrace(); } }
上述代码在表达式不含括号时可正常计算百分号,但表达式包含括号时会计算失败。
请问是否有Java库可以支持处理包含标准运算符、括号、百分号运算符任意组合的表达式?
内容的提问来源于stack exchange,提问作者deepak kulkarni
相关产品推荐
相关产品推荐

