Formula公式语法

# 二、常量 表达式中可以直接使用常量,常量只支持字符、数值两大类,布尔值使用宏变量TRUE, FALSE(不区分大小写)代替。
## 1、字符常量 字符常量需要用单引号''括起。 ```java 'abc' + 'defg' ``` 计算结果:"abcdefg"
## 2、数值常量 数值常量直接输入数字、小数点。 ```java 100 + 200.1234 ``` 计算结果(双精度double类型):300.1234
注意: 使用数值常量进行四则运算时,可能会自动进行类型转换,转为双精度double类型(15-16位有效数字),精度可能会丢失,导致计算结果错误。
# 三、变量 表达式可以直接引用外部传入的变量。 配置表达式时用变量名占位,执行时用传入的变量值代替变量名进行计算。如果变量名是中文或特殊符号,需要用"[ ]"隔开。 变量支持字符、数值、日期、布尔等各种类型。 常见的变量如单据字段,配置时使用字段标识作为变量名,实际运行时使用实际传入的字段值计算结果。
## 1、样例 ```java var1 + var2 + [中文变量1] ``` 说明: - var1,var2 :变量名 - [中文变量1] :中文变量名 - 加号+表示四则运算中的加运算 - 下文中,`Assert.assertEquals` 用于判断表达式的计算结果。如果代码执行通过,说明计算结果符合预期;如果代码执行失败,则说明计算结果不符合预期。
## 2、验证代码 ```java /** * 测试变量 */ @Test public void test_variable() { String formul = "var1 + var2 + [中文变量1]"; // 设置变量值 Map<String, Object>ctx = new HashMap<>(3); ctx.put("var1", 1); ctx.put("var2", 2); ctx.put("[中文变量1]", 3); Object result = FormulaEngine.execExcelFormula(formul, ctx); // result的预期值为6 Assert.assertEquals(6, result); } ``` 在此例中,代码执行通过,说明计算结果为6,是Integer类型,符合预期。
## 3、未识别的变量 如果公式中使用了未识别的变量名,即执行时未传入变量值,会使用变量默认值null进行计算,结果可能不符合预期。 ```java /** * 测试未识别的变量(即运行时未给用到的变量传值) */ @Test public void test_unknowVariable() { String formul = "var1 + var2"; Object result = FormulaEngine.execExcelFormula(formul); Assert.assertEquals(null, result); } ``` 代码执行通过,说明计算结果为null,执行时未传入变量值。
## 4、宏变量 公式引擎预置了几个宏变量,可以在表达式中当常量使用。 1. TRUE:布尔值,真 2. FALSE:布尔值,假 3. NULL:空值 宏变量名不区分大小写。
使用宏变量的表达式样例: ```java var1 = NULL ``` 变量var1传入null,计算结果为true,Boolean类型。
验证代码: ```java /** * 测试宏变量-NULL */ @Test public void test_null() { String formul = "var1 = NULL"; Map<String, Object> ctx = new HashMap<>(2); ctx.put("var1", null); Object result = FormulaEngine.execExcelFormula(formul); Assert.assertEquals("计算结果符合预期", true, result); } ``` 代码执行通过,说明计算结果result的值为true,Boolean类型,符合预期。
# 四、操作符 支持的操作符包括: - 四则运算:"+", "-", "*", "/", "%" - 字符拼接:"&" - 逻辑运算:"and", "or", "xor", "not" - 比较运算:"=", "!=", ">", ">=", "<", "<=", "<>" - 集合运算:"IN", "NOT IN", "LIKE", "NOT LIKE" - 负数:"-"
## 1、四则运算 四则运算符包括:"+", "-", "*", "/", "%",对数值进行运算,返回数值。
### 1). 加 "+" 支持数值相加,也可用作拼接字符,其他类型相加会报错。 - 数值相加: ```java 1 + 2 ``` 计算结果: 3
- 字符拼接: ```java '1' + '2' ``` 计算结果:"12"
- 字符串+数值,拼接: ```java '1' + 2 ``` 计算结果: "12"
- 数值+字符串,报错中断(需使用函数转换类型后再相加): ```java 1 + '2' ``` 计算结果: 执行报错,抛出FormulaException异常
### 2). 减 "-" 数值相减。 ```java 3 - 1 ``` 计算结果:2
### 3). 乘 "*" 数值相乘。 ```java 2 * 3 ``` 计算结果:6
注意:整数、小数相乘会导致精度发生变化,可能会溢出。
### 4). 除 "/" 数值相除。 ```java 6 / 2 ``` 结算结果:3
注意:NULL值运算结果可能不符合预期。
```java 6 / NULL ``` 计算结果:null
- 除0会中断 ```java 6 / 0 ``` 计算结果:中断报错
### 5). 取余 "%" 整数相除取余数。(只支持整数) ```java 7 % 2 ``` 计算结果:1
## 2、字符拼接 ### 1). 拼接 "&" ```java 'abc' & 'defg' ``` 计算结果:"abcdefg"
提示:也可以用"+"进行字符拼接。
## 3、逻辑运算 逻辑运算符包括:"and", "or", "xor", "not",对布尔值进行运算,返回布尔值。
### 1). 逻辑且 "and" 左右值均为true,则返回true,否则返回false。 ```java true and false ``` 计算结果:false
### 2). 逻辑或 "or" 左右值任一为true,则返回true;左右都为false则返回false。 ```java true or false ``` 计算结果:true
### 3). 异或 "xor" 逻辑判断,左右值不等为true,左右值相等为false。 ```javascript true xor true ``` 计算结果:false
```java true xor false ``` 计算结果:true
```java false xor false ``` 计算结果:false
### 4). 逻辑非 "not" 单目运算,对右值取否。 ```java not false ``` 计算结果:true
## 4、比较运算 对字符、数值、布尔值、日期等进行比较,返回布尔值,比较运算符包括:"=", "!=", ">", ">=", "<", "<=", "<>"。 - 字符从前往后比,区分大小写,小写字母大 - 两个null值相等,null比任何值都小 - 布尔值,true大于false
### 1). 相等 "=" 左右值相等为true,比较字符区分大小写。 ```java 'a' = 'A' ``` 计算结果:false
### 2). 不等 "!=" 左右值不等为true,比较字符区分大小写。 ```java 'a' != 'A' ``` 计算结果:true
### 3). 大于 ">" 左值大于右值为true,小写字母大。 ```java 'a' > 'A' ``` 计算结果:true
### 4). 大于等于 ">=" 左值等于或大于右值为true,小写字母大。 ```java 'A' >= 'a' ``` 计算结果:false
### 5). 小于 "<" 左值小于右值为true,小写字母大。 ```java 'A' < 'a' ``` 计算结果:true
### 6). 小于等于 "<=" 左值小于或者等于右值为true,小写字母大。 ```java 'a' <= 'A' ``` 计算结果:false <br> ### 7). 不等 "<>" 左右不等为true,同"!=",比较字符区分大小写。 ```java 'a' <> 'A' ``` 计算结果:true
## 5、集合运算 集合运算符包括:"IN", "NOT IN", "LIKE", "NOT LIKE"。 集合值可用括号"( )"括起。
### 1). 含在 "IN" 左值为元素,右值为集合,元素含在集合中则返回true。 ```java 'a' IN ('a', 'b', 'c') ``` 计算结果:true
### 2). 未含在 "NOT IN" 左值为元素,右值为集合,元素未含在集合中则返回true。 ```java 'a' NOT IN ('b', 'c', 'd') ``` 计算结果:true
### 3). 匹配 "LIKE" 字符串运算,比较左右值是否匹配,区分大小写,可使用"%"为通配符。 - 未使用通配符,左右值相等则返回true,否则为false ```java 'Abcd' LIKE 'Abcd' ``` 计算结果:true
```java 'Abcd' LIKE 'A' ``` 计算结果:false
- 通配符在左边,以右值结尾则返回true,否则为false ```java 'Abcd' LIKE '%d' ``` 计算结果:true
```java 'Abcd' LIKE '%c' ``` 计算结果:false
- 通配符在右边,以右值开头则返回true,否则为false ```java 'Abcd' LIKE 'A%' ``` 计算结果:true
```java 'Abcd' LIKE 'b%' ``` 计算结果:false
- 通配符在两边,包含了右值则返回true,否则为false ```java 'Abcd' LIKE '%bc%' ``` 计算结果:true
### 4). 不匹配 "NOT LIKE" 字符串运算,对"LIKE"比较结果取反。
## 6、负数 负数符号"-",单目运算符,对数值取负数处理。 ```java -var1 ``` var1传入1,返回-1。
# 五、函数 公式引擎内置了部分函数,可以在表达式中使用,分为8大类: 1. 字符函数:对字符串进行处理 2. 数学函数:对数值进行处理 3. 时间函数:对日期时间进行处理 4. 集合函数:对集合进行处理 5. 判断函数:IF判断 6. 空值处理:对空值进行处理 7. 通用函数:取值、取环境变量等 8. 其他函数:业务或者二开扩展的函数 
## 1、字符函数 | 函数标识 | 函数名称 | 函数格式 | | ---------- | ---------------- | -------------------------------------------- | | STRING | 转换为字符串 | STRING(obj) | | LEFT | 左截取 | LEFT(str, len) | | RIGHT | 右截取 | RIGHT(str, len) | | SUBSTRING | 截取字符串 | SUBSTRING(str, start_num, len) | | REPT | 重复拼接 | REPT(str, num) | | TRIM | 去掉前后空格 | TRIM(str) | | LOWER | 转成小写 | LOWER(str) | | UPPER | 转成大写 | UPPER(str) | | FIND | 搜索字符串 | FIND(substr, str, start_num) | | CONCAT | 拼接字符串 | CONCAT(str[]) | | SUBSTITUTE | 替换第一个字符串 | SUBSTITUTE(str, old_str, new_str, start_num) | | REPLACE | 替换全部字符串 | REPLACE(str, old_str, new_str) | | LEN | 字符串长度 | LEN(str) |
### 1). STRING - 函数描述:把任意类型值转换为字符串 - 函数格式:STRING(obj) - 函数参数: - obj:需要转换字符串的任意类型值 - 举例 ```java STRING(DATE('2018-08-08')) ``` 计算结果:“2018-08-08”
```java STRING(1.29) ``` 计算结果:"1.29"
### 2). LEFT - 函数描述:截取字符串的左边 - 函数格式:LEFT(str, len) - 函数参数: - str:原始字符串; - len:从左边开始截取的字符串长度,超过字符串总长度则返回原始字符串; - 举例: ```java LEFT('abc', 1) ``` 计算结果:"a"
```java LEFT('abc', 10) ``` 计算结果:"abc"
### 3). RIGHT - 函数描述:截取字符串的右边 - 函数格式:RIGHT(str, len) - 函数参数: - str:原始字符串; - len:从右边开始截取的字符串长度,超过字符串总长度则返回原始字符串; - 举例: ```java RIGHT('abc', 1) ``` 计算结果:"c"
```java RIGHT('abc', 10) ``` 计算结果:"abc"
### 4). SUBSTRING - 函数描述:从指定位置截取字符串 - 函数格式:SUBSTRING(str, start_num, len) - 函数参数: - str:原始字符串; - start_num:开始位置,整数,从0开始;位置超过字符总长会报错。 - len:截取长度,整数;超过总长则返回从开始位置到结束的全部字符。 - 举例: ```java SUBSTRING('abc', 0, 1) ``` 计算结果:"a"
```java SUBSTRING('abc', 5, 1) ``` 计算结果:超出索引范围,中断报错
```java SUBSTRING('abc', 0, 10) ``` 计算结果:"abc"
### 5). REPT - 函数描述:拼接字符串多次 - 函数格式:REPT(str, num) - 函数参数: - str:原始字符串; - num:拼接次数,大于0的整数;传入0或负数会报错 - 举例: ```java REPT('abc', 2) ``` 计算结果:"abcabc"
### 6). TRIM - 函数描述:去掉字符串前后两边的空格 - 函数格式:TRIM(str) - 函数参数: - str:原始字符串,需去掉前后两边的空格 - 举例: ```java TRIM(' a b c ') ``` 计算结果:"a b c"
### 7). LOWER - 函数描述:把字符全部转成小写 - 函数格式:LOWER(str) - 函数参数: - str:原始字符串 - 举例: ```java LOWER('aBc') ``` 计算结果:"abc"
### 8). UPPER - 函数描述:把字符全部转成大写 - 函数格式:UPPER(str) - 函数参数: - str:原始字符串 - 举例: ```java UPPER('aBc') ``` 计算结果:"ABC"
### 9). FIND - 函数描述:搜索字符串,返回子字符串的开始位置,第一个字符位置为0;未找到返回-1 - 函数格式:FIND(substr, str, start_num) - 函数参数: - substr:包含的子字符串; - str:原始字符串; - start_num:开始搜索位置,整数,从0开始;传入负数从头搜索,传入超长整数,返回-1; - 举例: ```java FIND('b', 'abc', 0) ``` 计算结果:1
```java FIND('d', 'abc', 0) ``` 计算结果:-1
```java FIND('b', 'abc', 10) ``` 计算结果:-1
### 10). CONCAT - 函数描述:把传入的字符串数组,拼接成一个完整的字符串返回 - 函数格式:CONCAT(str[]) - 函数参数: - str[]:字符串数组 - 举例: ```java CONCAT('a', 'b', 'c') ``` 计算结果:"abc"
### 11). SUBSTITUTE - 函数描述:从开始位置,把搜索到的第一个字符串替换掉 - 函数格式:SUBSTITUTE(str, old_str, new_str, start_num) - 函数参数: - str:原始字符串; - old_str:被替换的字符串; - new_str:新字符串; - start_num:开始搜索位置,从1开始,传0会报错 - 举例: ```java SUBSTITUTE('aaa','a','b',1) ``` 计算结果: "baa"
### 12). REPLACE - 函数描述:替换掉所有能搜索到的字符串 - 函数格式:REPLACE(str, old_str, new_str) - 函数参数: - str:原始字符串; - old_str:被替换的字符串; - new_str:新字符串 - 举例: ```java REPLACE('aaa', 'a', 'b') ``` 计算结果:"bbb"
### 13). LEN - 函数描述:返回字符串的长度 - 函数格式:LEN(str) - 函数参数: - str:原始字符串 - 举例: ```java LEN('abc') ``` 计算结果:3
## 2、数学函数 | 函数标识 | 函数名称 | 函数格式 | | --------- | ---------- | --------------------- | | ROUND | 四舍五入 | ROUND(num, scale) | | ROUNDUP | 向上舍入 | ROUNDUP(num, scale) | | ROUNDDOWN | 向下舍入 | ROUNDDOWN(num, scale) | | ABS | 取绝对值 | ABS(num) | | INT | 取整 | INT(num) | | NUMBER | 转换成数值 | NUMBER(obj) | | NUMBERSTRING | 转换成数值 | NUMBERSTRING(num, type) |
### 1). ROUND - 函数描述:对数值进行四舍五入 - 函数格式:ROUND(num, scale) - 函数参数: - num:需要四舍五入的数值; - scale:保留小数位,整数; - 举例: ```java ROUND(1.24, 1) ``` 计算结果:1.2
```java ROUND(1.25, 1) ``` 计算结果:1.3
### 2). ROUNDUP - 函数描述:对数值进行向上舍入 - 函数格式:ROUNDUP(num, scale) - 函数参数: - num:需要向上舍入的数值; - scale:保留小数位,整数; - 举例: ```java ROUNDUP(1.24, 1) ``` 计算结果:1.3
### 3). ROUNDDOWN - 函数描述:靠近零值,向下舍入数值 - 函数格式:ROUNDDOWN(num, scale) - 3.函数参数: - num:需要向下舍入的数值; - scale:保留小数位,整数; - 举例: ```java ROUNDDOWN(1.29, 1) ``` 计算结果:1.2
### 4). ABS - 函数描述:返回数值的绝对值,传入负数返回正数,传入正数返回原值 - 函数格式:ABS(num) - 函数参数: - num:需要计算绝对值的实数 - 举例: ```java ABS(-5) ``` 计算结果:5
```java ABS(5) ``` 计算结果:5
### 5). INT - 函数描述:返回数值的整数部分 - 函数格式:INT(num) - 函数参数: - num:需要取整的实数 - 举例: ```java INT(1.9) ``` 计算结果:1
### 6). NUMBER - 函数描述:把字符串转为数值 - 函数格式:NUMBER(obj) - 函数参数: - obj:需要转换为数值的参数,如果参数不能转为数值则返回0 - 举例: ```java NUMBER('1.29') ``` 计算结果:1.29
```java NUMBER('a') ``` 计算结果:0
### 7). NUMBERSTRING - 函数描述:将数值转换为中文金额字符串 - 函数格式:NUMBERSTRING(num, type) - 函数参数: - num:要转换成中文金额的数值 - type:返回中文的类型,1代表汉字小写,2代表汉字大写 - 举例: ```java NUMBERSTRING(100.03, 1) ``` 计算结果:一百元零三分
```java NUMBERSTRING(100, 2) ``` 计算结果:壹佰元整
## 3、时间函数 | 函数标识 | 函数名称 | 函数格式 | | -------- | -------------------- | --------------------------------- | | NOW | 当前时间 | NOW() | | TO_DATE | 转换时间(指定时区) | TO_DATE(str, format, timezone) | | TO_CHAR | 日期转字符串 | TO_CHAR(dateTime, 'yyyy-MM-dd') | | DATE | 转换日期(字符串) | DATE(strDate) | | YMDDATE | 转换日期(年月日) | DATE(year, month, day) | | YEAR | 获取年份 | YEAR(dateTime) | | MONTH | 获取月份 | MONTH (dateTime) | | DAY | 获取日 | DAY(dateTime) | | QUARTER | 获取季度 | QUARTER(dateText) | | DATEDIF | 比较日期大 | DATEDIF(date1, date2, unit)>0 | | DATEADD | 日期增减 | DATEADD(datepart, number, date) |
### 1). NOW - 函数描述:获取当前时间 - 函数格式:NOW() - 函数参数:无 - 举例: ```java NO
Formula公式语法
金蝶云苍穹开发平台有很多场景需要配置条件和公式,语法类似于Excel表达式,支持常量、变量、函数,能进行四则运算、逻辑运算和比较运算等...
点击下载文档文档为doc格式
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
上一篇
已经是第一篇



