当前位置:首页 > 后端开发 > 正文

java怎么计算字符串公式

Java中,可以使用 ScriptEngineManager和 JavaScript引擎来计算字符串公式。,“ java,import javax.script.ScriptEngine;,import javax.script.ScriptEngineManager;,import javax.script.ScriptException;,public class CalculateFormula {, public static void main(String[] args) {, String formula = "3 + 5 2";, ScriptEngineManager manager = new ScriptEngineManager();, ScriptEngine engine = manager.getEngineByName("JavaScript");, try {, Object result = engine.eval(formula);, System.out.println("Result: " + result);, } catch (ScriptException e) {, e.printStackTrace();, }, },},` ,这段代码会输出Result: 13.

Java中计算字符串公式,通常需要将字符串形式的数学表达式解析并计算出结果,以下是几种常见的方法:

使用ScriptEngineManager

Java提供了ScriptEngineManager类,可以用来执行JavaScript代码,从而计算字符串公式,以下是一个示例:

java怎么计算字符串公式 第1张

使用第三方库(如exp4j)

exp4j是一个轻量级的表达式解析库,可以方便地计算字符串公式,首先需要在项目中引入exp4j依赖。

Maven依赖

<dependency> <groupId>net.objecthunter</groupId> <artifactId>exp4j</artifactId> <version>0.4.8</version> </dependency>

示例代码

import net.objecthunter.exp4j.Expression; import net.objecthunter.exp4j.ExpressionBuilder; public class CalculateFormula { public static void main(String[] args) { String formula = "2 + 3 (4 1)"; Expression expression = new ExpressionBuilder(formula).build(); double result = expression.evaluate(); System.out.println("Result: " + result); } }

自定义解析器

如果不想依赖外部库,可以自己实现一个简单的解析器,这种方法适用于简单的表达式,复杂的表达式可能需要更复杂的解析逻辑。

示例代码

import java.util.Stack; public class CalculateFormula { public static void main(String[] args) { String formula = "2 + 3 (4 1)"; try { double result = evaluateExpression(formula); System.out.println("Result: " + result); } catch (Exception e) { e.printStackTrace(); } } public static double evaluateExpression(String expression) throws Exception { // 去除空格 expression = expression.replaceAll("\s+", ""); Stack<Double> numbers = new Stack<>(); Stack<Character> operators = new Stack<>(); int i = 0; while (i < expression.length()) { char c = expression.charAt(i); if (Character.isDigit(c)) { double num = 0; while (i < expression.length() && Character.isDigit(expression.charAt(i))) { num = num 10 + (expression.charAt(i) '0'); i++; } numbers.push(num); continue; } else if (c == '(') { operators.push(c); } else if (c == ')') { while (operators.peek() != '(') { numbers.push(applyOperation(operators.pop(), numbers.pop(), numbers.pop())); } operators.pop(); } else if (isOperator(c)) { while (!operators.isEmpty() && precedence(operators.peek()) >= precedence(c)) { numbers.push(applyOperation(operators.pop(), numbers.pop(), numbers.pop())); } operators.push(c); } i++; } while (!operators.isEmpty()) { numbers.push(applyOperation(operators.pop(), numbers.pop(), numbers.pop())); } return numbers.pop(); } private static boolean isOperator(char c) { return c == '+' || c == '-' || c == '' || c == '/'; } private static int precedence(char operator) { switch (operator) { case '+': case '-': return 1; case '': case '/': return 2; default: return -1; } } private static double applyOperation(char operator, double b, double a) throws Exception { switch (operator) { case '+': return a + b; case '-': return a b; case '': return a b; case '/': return a / b; default: throw new Exception("Invalid operator"); } } }

使用JEP库

JEP(Java Expression Parser)是另一个强大的表达式解析库,首先需要在项目中引入JEP依赖。

java怎么计算字符串公式 第2张

Maven依赖

<dependency> <groupId>org.javia.arity</groupId> <artifactId>javia-arity</artifactId> <version>1.0.0</version> </dependency>

示例代码

import org.javia.arity.Symbols; import org.javia.arity.SyntaxException; import org.javia.arity.Util; import org.javia.arity.Var; import org.javia.arity.parser.; import org.javia.arity.types.; public class CalculateFormula { public static void main(String[] args) { String formula = "2 + 3 (4 1)"; try { Parser parser = new Parser(); Value value = parser.parse(formula); System.out.println("Result: " + value.doubleValue()); } catch (SyntaxException e) { e.printStackTrace(); } } }

使用MVEL库

MVEL(MVFLEX Expression Language)是另一个强大的表达式语言库,首先需要在项目中引入MVEL依赖。

Maven依赖

<dependency> <groupId>org.mvel</groupId> <artifactId>mvel2</artifactId> <version>2.4.12.Final</version> </dependency>

示例代码

import org.mvel2.MVEL; import org.mvel2.integration.impl.MapVariableResolverFactory; import java.util.HashMap; import java.util.Map; public class CalculateFormula { public static void main(String[] args) { String formula = "2 + 3 (4 1)"; Map<String, Object> variables = new HashMap<>(); try { Object result = MVEL.eval(formula, new MapVariableResolverFactory(variables)); System.out.println("Result: " + result); } catch (Exception e) { e.printStackTrace(); } } }

使用ANTLR库

ANTLR(Another Tool for Language Recognition)是一个强大的解析器生成工具,可以用来构建复杂的表达式解析器,首先需要在项目中引入ANTLR依赖。

Maven依赖

<dependency> <groupId>org.antlr</groupId> <artifactId>antlr4-runtime</artifactId> <version>4.9.2</version> </dependency>

示例代码

import org.antlr.v4.runtime.; import org.antlr.v4.runtime.tree.; public class CalculateFormula { public static void main(String[] args) { String formula = "2 + 3 (4 1)"; try { CharStream input = CharStreams.fromString(formula); ExprLexer lexer = new ExprLexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); ExprParser parser = new ExprParser(tokens); ParseTree tree = parser.expr(); EvalVisitor visitor = new EvalVisitor(); double result = visitor.visit(tree); System.out.println("Result: " + result); } catch (Exception e) { e.printStackTrace(); } } }

使用JEXL库

JEXL(Java EXpression Language)是另一个表达式解析库,首先需要在项目中引入JEXL依赖。

Maven依赖

<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-jexl</artifactId> <version>3.1</version> </dependency>

示例代码

import org.apache.commons.jexl3.; public class CalculateFormula { public static void main(String[] args) { String formula = "2 + 3 (4 1)"; JexlEngine jexl = new JexlBuilder().create(); JexlExpression e = jexl.createExpression(formula); JexlContext jc = new MapContext(); Object result = e.evaluate(jc); System.out.println("Result: " + result); } }

使用Spring Expression库

Spring Expression是Spring框架中的一个模块,可以用来解析和计算表达式,首先需要在项目中引入Spring Expression依赖。

Maven依赖

<dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>5.3.20</version> </dependency>

示例代码

import org.springframework.expression.ExpressionParser; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.StandardEvaluationContext; public class CalculateFormula { public static void main(String[] args) { String formula = "2 + 3 (4 1)"; ExpressionParser parser = new SpelExpressionParser(); StandardEvaluationContext context = new StandardEvaluationContext(); Double result = parser.parseExpression(formula).getValue(Double.class, context); System.out.println("Result: " + result); } }

使用Jep库

Jep是另一个表达式解析库,首先需要在项目中引入Jep依赖。

Maven依赖

<dependency> <groupId>black.ninia</groupId> <artifactId>jep</artifactId> <version>20230610</version> </dependency>

示例代码

import black.ninia.jep.Jep; import black.ninia.jep.JepException; import black.ninia.jep.Node; import black.ninia.jep.function.Operator; import black.ninia.jep.function.OperatorSet; import black.ninia.jep.function.PostfixMathCommand; import black.ninia.jep.function.PrefixMathCommand; import black.ninia.jep.function.TernaryOperator; import black.ninia.jep.function.UnaryOperator; import black.ninia.jep.function.BinaryOperator; import black.ninia.jep.function.PowerOperator; import black.ninia.jep.function.MinusOperator; import black.ninia.jep.function.PlusOperator; import black.ninia.jep.function.MultiplyOperator; import black.ninia.jep.function.DivideOperator; import black.ninia.jep.function.ModuloOperator; import black.ninia.jep.function.AndOperator; import black.ninia.jep.function.OrOperator; import black.ninia.jep.function.NotOperator; import black.ninia.jep.function.EqualOperator; import black.ninia.jep.function.NotEqualOperator; import black.ninia.jep.function.GreaterThanOperator; import black.ninia.jep.function.LessThanOperator; import black.ninia.jep.function.GreaterThanOrEqualOperator; import black.ninia.jep.function.LessThanOrEqualOperator; import black.ninia.jep.function.ConditionalOperator; import black.ninia.jep.function.FunctionSet; import black.ninia.jep.function.FunctionWrapper; import black.ninia.jep.function.Function0; import black.ninia.jep.function.Function1; import black.ninia.jep.function.Function2; import black.ninia.jep.function.Function3; import black.ninia.jep.function.Function4; import black.ninia.jep.function.FunctionN; import black.ninia.jep.function.FunctionM; import black.ninia.jep.function.FunctionV; import black.ninia.jep.function.FunctionX; import black.ninia.jep.function.FunctionY; import black.ninia.jep.function.FunctionZ; import black.ninia.jep.function.FunctionA; import black.ninia.jep.function.FunctionB; import black.ninia.jep.function.FunctionC; import black.ninia.jep.function.FunctionD; import black.ninia.jep.function.FunctionE; import black.ninia.jep.function.FunctionF; import black.ninia.jep.function.FunctionG; import black.

java怎么计算字符串公式 第3张

0