麒麟正青春

 

对字符串形式的公式进行数学计算处理方法

一、通过JavaScript引擎(Nashorn)进行处理,较新jdk版本不支持

在JavaFX中,将字符串表示的公式转化为实际可计算的公式是一个涉及到解析和评估字符串表达式的过程。你可以使用Java的内置库javax.script来实现这个功能。javax.script允许你执行JavaScript代码,包括数学表达式,并且它提供了强大的脚本引擎,如JavaScript引擎(Nashorn)。

以下是一个简单的例子,演示了如何使用javax.script来评估一个字符串形式的数学表达式:

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

public class EvaluateExpression {

public static void main(String[] args) {
// 创建一个JavaScript引擎
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");

// 定义一个数学表达式字符串
String expression = "x + y - z";

// 为表达式中的变量赋值
engine.put("x", 5);
engine.put("y", 10);
engine.put("z", 3);

try {
// 评估表达式并获取结果
Object result = engine.eval(expression);

// 输出结果
System.out.println("Result: " + result);

} catch (ScriptException e) {
e.printStackTrace();
}
}
}
在这个例子中,我们首先创建了一个ScriptEngineManager实例,然后获取了JavaScript引擎。我们定义了一个表达式字符串,并在引擎中设置了变量x,y,z的值。最后,我们使用engine.eval方法来评估表达式并打印结果。

如果你正在开发JavaFX应用程序,并且想要在界面上接受用户输入的公式,并对其进行计算,你可以使用类似的方法。用户输入的公式可以作为字符串传递给ScriptEngine.eval方法,然后你可以处理结果并将计算结果显示给用户。

请注意,在实际应用中,你需要对用户输入的公式进行适当的验证和异常处理,以确保安全性和健壮性。此外,这个例子使用的是JavaScript引擎,它支持ECMAScript 5.1规范,所以你可以使用各种JavaScript特性,包括数学运算符。如果你需要支持更复杂的数学表达式或函数,你可能需要使用专门的数学库,如Apache Commons Math库。

二、使用 Apache Commons JEXL

Apache Commons JEXL 是一个用于执行表达式语言的库,它可以用来解析并执行简单的数学表达式。以下是一个使用 Apache Commons JEXL 的示例:

  1. 添加依赖:首先,你需要在你的项目中包含 JEXL 的依赖。如果你使用 Maven,可以添加如下依赖到你的 pom.xml

    xml复制代码
      <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-jexl3</artifactId>
      <version>3.2.1</version>
      </dependency>
  2. 编写代码:使用 JEXL 表达式引擎来解析并执行字符串公式:

    java复制代码
      import org.apache.commons.jexl3.JexlBuilder;
      import org.apache.commons.jexl3.JexlEngine;
      import org.apache.commons.jexl3.JexlExpression;
       
      public class MathExpressionEvaluator {
      public static void main(String[] args) {
      String expression = "3 + 4 * 2";
       
      JexlEngine jexl = new JexlBuilder().create();
      JexlExpression e = jexl.createExpression(expression);
       
      try {
      Object result = e.evaluate(null); // 对于简单的数学表达式,上下文参数可以为 null
      System.out.println("Result: " + result);
      } catch (Exception e1) {
      e1.printStackTrace();
      }
      }
      }

三、使用第三方类库,需要手动下载jar文件加入项目中

如果你想使用JEP,你可以在Maven中添加以下依赖:

<!-- jep-java-4.0-trial.jar文件maven仓库官网不存在需要手动下载再加入pom.xml及项目中,
官网地址:https://www.singularsys.com/jep/download-trial.php
-->

<dependency>
<groupId>com.singularsys</groupId>
<artifactId>jep</artifactId>
<version>4.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/jep-java-4.0-trial.jar</systemPath>
</dependency>

然后使用JEP来计算表达式:

import com.singularsys.jep.Jep;
import com.singularsys.jep.ParseException;

public class JepExpressionEvaluator {

    public static void main(String[] args) {
        // 创建一个Jep实例
        Jep jep = new Jep();

        // 定义一个字符串公式
        String formula = "2 * (3 + 4)";

        try {
            // 解析并计算字符串公式
            jep.parse(formula);
            Object result = jep.evaluate();

            // 输出结果
            System.out.println("Result: " + result);

        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

JEP也提供了丰富的功能,如自定义函数、运算符重载等,可以根据你的需要进行扩展。

/////////////////////////////////////////////////////////////参照///////////////////////////////////////////////////////////////////

Java第三方库——Jep数学公式计算
官网简介:JEP JAVA仅用几行代码解析和计算数学表达式。这个包允许用户以字符串的形式输入公式,并立即对其求值。JEP支持用户定义的变量、常量和函数。包括一些常用的数学函数和常量。

1.下载3.x版本依赖并引入
官方网站:http://www.singularsys.com/jep/download-trial.php

由于Maven仓库中目前没有3.x版本的jep,需要手动下载引入到项目中 

 

下载的压缩包中包含jar包,放入项目目录下并在pom.xml中引入,这里我是放到了resources/lib下

 

 

<dependency>
<groupId>com.singularsys</groupId>
<artifactId>jep</artifactId>
<version>3.5</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/jep-java-3.5-trial.jar</systemPath>
</dependency>

2.使用并测试
这里主要测试了四种情况:

常规数字构成的公式
公式中分母为0
布尔表达式
逻辑运算
具体测试代码如下:

import com.singularsys.jep.Jep;
import com.singularsys.jep.JepException;

public class jepTest {

public static void main(String[] args) {

try {
Jep jep=new Jep();

//常规公式
String formula1 = "3x+4y+-5z";
jep.addVariable("x",1);
jep.addVariable("y",1);
jep.addVariable("z",1);
jep.parse(formula1);
System.out.println("测试公式1:"+jep.evaluate().toString());

//公式中分母为0
String formula2 = "3/0";
jep.parse(formula2);
System.out.println("测试公式2:"+jep.evaluate().toString());

//布尔表达式
String formula3 = "3>=0";
jep.parse(formula3);
System.out.println("测试公式3:"+jep.evaluate().toString());

//逻辑运算
// String formula4 = "1&&0";
// String formula4 = "1||0";
String formula4 = "1!=1";
jep.parse(formula4);
System.out.println("测试公式4:"+jep.evaluate().toString());

} catch (JepException e) {
e.printStackTrace();
}


}

}


运行结果:

测试公式1:2.0
测试公式2:Infinity
测试公式3:true
测试公式4:false
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_42391904/article/details/115353191

 

posted on 2024-07-31 17:08  麒麟正青春  阅读(58)  评论(0编辑  收藏  举报

导航