# formula
**Repository Path**: walterInKitchen/formula
## Basic Information
- **Project Name**: formula
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-03-20
- **Last Updated**: 2022-03-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: 代数公式, 计算器
## README
## formula
简单的代数公式求解器
```java
// 假设:a=10;b=2;c=3;
// 则res为:0.5
BigDecimal res = resolver.resolveResult("a*(b+c)/100", context);
```
### 快速入手
引入依赖
```xml
io.github.walterinkitchen
formula
1.0.3
```
为公式解析器提供context,解析器将从context中查找’变量‘的值
```java
Context context = new Context() {
@Override
public BigDecimal getDecimalValueOfIdentifier(String s) {
switch (s) {
case "a":
return new BigDecimal("10");
case "b":
return new BigDecimal("2");
case "c":
return new BigDecimal("3");
}
return null;
}
};
return context;
```
实例化一个公式解析器,传入公式与context得到结果
```java
FormulaResolver resolver = new FormulaResolver();
BigDecimal res = resolver.resolveResult("a*(b+c)/100", context);
System.out.println(res); // res=0.5
```
### 支持的特性
#### 自定义的变量名
```java
// 变量名由至少一个字母组成
"a*(b+c)/100"
"va+vairableB*100"
```
#### 变量的值类型
为适应表达式中的不同的运算类型,目前支持两种值类型:Decimal类型,Decimal集合类型;
'+-*/'运算符需要一个Decimal类型的变量,需要在上下文中返回Decimal类型的值
```java
Context context = new Context() {
// 如果是Decimal类型的值,需要在该方法中返回值
@Override
public BigDecimal getDecimalValueOfIdentifier(String s) {
if (s.equals("a")) {
return BigDecimal.ZERO;
}
return null;
}
};
```
部分函数需要Decimal集合类型的值,需要在上下文中返回集合类型的值
```java
Context context = new Context() {
// 如果是结合类型的值,需要在该方法中返回一个集合
@Override
public List getDecimalListByIdentifier(String identifier) {
if (identifier.equals("b")) {
return Arrays.asList(BigDecimal.ONE, BigDecimal.TEN);
}
return null;
}
};
```
#### 加减乘除
```java
// 加减乘除支持优先级
"a+b*c" // 先算乘法,再算加法
```
#### 括号
```java
// 支持括号,括号内的优先级更高
"(a+b)*c" // 先算加法,再算乘法
```
#### 函数
##### 默认支持的函数:
max,min,avg
他们都要求括号内为一个变量,且变量类型为Decimal集合类型
```java
"a*max(b)" // a*b中的最大值
```
#### 配置精度
默认精度是10,即精确到小数点后4位;如果想自定义精度,可以在"resources"目录下创建"io.formula.properties"文件;
并在文件中写入一行来配置精度
```properties
#等号后面提供一个整数的精度,不支持负数
decimalScale=2
```
#### 注册自己的函数
实现接口:
io.github.walterinkitchen.formula.function.Function
提供一个public的无参构造器
为函数提供一个名字:不带括号与空格,仅支持字符组成的函数名
```java
/**
* 自定义函数
*
* @author walter
* @date 2022/3/20
**/
public class CustomerFunction implements Function {
// 一个public的无参构造器
public CustomerFunction() {
}
@Override
public String getName() {
// 返回函数盟
return "customerFunction";
}
@Override
public BigDecimal resolveResult(Operand arg, Context context) throws FormulaException {
// 实现该方法将参数计算为函数结果返回
return null;
}
}
```
最后一步:注册函数
在"resources/META-INF/services"目录下(如果没有该目录,需要先创建该目录)创建文件:”io.github.walterinkitchen.formula.function.Function“
文件中每一行为自定义函数的类的全名
```text
resources/
├── META-INF
│ └── services
│ └── io.github.walterinkitchen.formula.function.Function //注册文件
```