各位好,在我们的日常开发需求中,有这样的一种需求,解析一个字符串的数学表达式,并将其结果获取到,例如需要开发一个计算器等需求的时候,这类技术往往是需要但却难以找到,而在GitHub中,发现了这样的一个框架,它实现了强悍的数学计算功能,从简单的无括号表达式到数列累加表达式,或者自定义函数计算表达式等,该框架中都有所实现,下面一起来看一下有关该框架的信息吧!
框架名称:mathematical-expression
框架链接PythonAPI:
框架链接C++:
框架链接Js与后端接口版本:
在上述的API有两套实现,语法上几乎是一致的,针对数学表达式需求的开发者们,可以直接通过maven, gradle,pip 三种方式获取到这个框架,可以说是比较友好的一种技术了,下面来带大家看一看,如何使用框架
1,将框架下载下来
针对Java或Scala开发者来说,通过maven获取到框架是有效的一种操作,maven导入mathematical-expression的依赖坐标就如下所示,当然啦,针对python党们,使用pip命令就是最好的选择,这个框架支持使用pip的哦!
请注意 在 Java API 的 1.2.X 版本中,数值的解析模块有一些问题,现如今在 1.2.X 版本中已经得到了解决,因此请使用 1.3.X 版本!!!
<dependencies>
<dependency>
<groupId>io.github.BeardedManZhao</groupId>
<artifactId>mathematical-expression</artifactId>
<version>1.3.1</version>
</dependency>
</dependencies>
pip install mathematical_expression_py
如果您是一位python玩家,可以在 mathematical-expression-py · PyPI 查阅到有关python的文档!
接下来,使用这个框架进行一个具有嵌套括号数学表达式的计算,一起来看看它的表现吧!
package core;
import core.calculation.number.BracketsCalculation2;
import core.container.CalculationNumberResults;
import exceptional.WrongFormat;
public class MAIN {
public static void main(String[] args) throws WrongFormat {
// 获取到括号表达式计算组件,这里就是为获取到的组件起一个唯一的名字
// 这个操作会将当前组件实例化,以name的名字添加到管理者中,如果这个名字在之前就已经使用过,只需要更换一个就好啦
BracketsCalculation2 bracketsCalculation2 = BracketsCalculation2.getInstance("name");
// 构建一个数学表达式 这是一个嵌套数学表达式,计算复杂表达式针对这个框架来说是没有问题的哦!
String s = "3 * (20 / (11 - 1))";
// 检查数学表达式是否有错误,针对确定没有问题的数学表达式,也可以不检查,如果检查出错误,这里会抛出错误信息
bracketsCalculation2.check(s);
// 计算数学表达式,会返回一个结果对象,其中存储着运算结果以及运算过程中的信息
CalculationNumberResults calculation = bracketsCalculation2.calculation(s);
System.out.println(calculation.getResult());
}
}
计算的时候有一些日志的产生,在resource文件夹下的log4j.xml文件中,设置了日志级别为INFO,因为有一些操作在日志中体现,我们看到“name”被注册到管理者中啦,这也是一个有趣的小设计,它将一个名字对应一个计算组件,使得计算组件可以像单例设计一样被复用,也可以被重新实例化 ,这里只是演示了一个计算功能啦,各位如果感兴趣,可以去试一下哦!!!
高阶操作
在此框架的 1.3.1 以及 以上的版本中,您可以直接使用数学函数公式的方法将一个函数注册到框架中,下面是一些实例
数学方式的函数注册与计算
package top.lingyuzhao;
import core.Mathematical_Expression;
import core.calculation.Calculation;
import core.calculation.function.FunctionPackage;
import exceptional.WrongFormat;
public class MAIN {
public static void main(String[] args) throws WrongFormat {
// 将 f 函数注册进来
Mathematical_Expression.register_function("f(x) = x * x");
// 准备要计算的表达式
final String data = "1 + f(20) + 3";
// 获取到计算组件
final Calculation instance = Mathematical_Expression.getInstance(Mathematical_Expression.functionFormulaCalculation2);
// 检查与计算
instance.check(data);
System.out.println(instance.calculation(data));
}
}
下面就是计算结果
CalculationNumberResults{result=404.0, source='BracketsCalculation2'}
匿名实现的函数注册于计算
package top.lingyuzhao;
import core.Mathematical_Expression;
import core.calculation.Calculation;
import core.calculation.function.FunctionPackage;
import core.calculation.function.ManyToOneNumberFunction;
import exceptional.WrongFormat;
public class MAIN {
public static void main(String[] args) throws WrongFormat {
// 将 f 函数注册进来
Mathematical_Expression.register_function(new ManyToOneNumberFunction("f") {
@Override
public double run(double... numbers) {
return 1 + numbers[0] * numbers[0] + 3;
}
});
// 准备要计算的表达式
final String data = "1 + f(20) + 3";
// 获取到计算组件
final Calculation instance = Mathematical_Expression.getInstance(Mathematical_Expression.functionFormulaCalculation2);
// 检查与计算
instance.check(data);
System.out.println(instance.calculation(data));
}
}
下面就是计算结果
CalculationNumberResults{result=408.0, source='BracketsCalculation2'}
鸣谢:@波光倩影 查找并告知到文章以及框架中的浮点数值解析错误,在此鸣谢!!! 欢迎各位小伙伴继续指正!