公式组件概述
公式组件是以接口的方式提供算数、字符串运算能力的组件。使用者定义公式和变量,公式组件根据公式和变量值进行运算并返回运算结果。
整体设计
依赖环境
组件采用Maven进行编译和打包发布,其对外提供的依赖方式如下:
<dependency>
<groupId>com.yonyou.iuap</groupId>
<artifactId>iuap-formula</artifactId>
<version>${iuap.modules.version}</version>
</dependency>
${iuap.modules.version} 为平台在maven私服上发布的组件的version。
功能说明
- 支持公式定义和执行;
- 支持公式批量执行;
- 提供数学运算、字符串运算能力
- 支持自定义函数功能扩展公式;
使用说明
说明简介
下文主要是对公式组件的基本使用进行简要说明,对公式函数中的一些特殊情况加以说明,并对公式函数自定义扩展功能予以介绍
调用说明
通过FormulaParseFather执行公式。
示例:
String formula = "a->abs(data)";
FormulaParseFather f = new FormulaParse();;
f.setExpress(formula);
f.addVariable("data", new Object[] { 1, -2, 0 });
Object[][] result = f.getValueOArray();
assertEquals("应该相等", 1, result[0][0]);
assertEquals("应该相等", 2, result[0][1]);
assertEquals("应该相等", 0, result[0][2]);
函数介绍
1.字符串函数
1.1 charat(string,index)
公式含义
得到字符串string中第index个字符
对应类:nc.vo.pub.formulaset.function.CharAt
类型返回值表
参数string | 参数index | 返回值 |
java.lang.String | Number | java.lang.String, index转换成int数值,与Java中charAt()结果相同,当index大于string长度时,抛出异常 |
java.lang.String | java.lang.String | java.lang.String,index必须可以直接从String转成int,如”1”(但“1.22”不行,转int失败抛异常),转换后与上一条执行结果相同。 |
1.2 endswith(string, end)
公式含义
判断字符串string是否以字符串end结尾
对应类:nc.vo.pub.formulaset.function.EndsWith
类型返回值表
参数string | 参数end | 返回值 |
java.lang.String | java.lang.String | java.lang.Double,与Java中String类方法endsWith返回结果相同,只不过返回Boolean |
null | 除null以外任何对象 | Boolean.FALSE |
除null以外任何对象 | null | Boolean.FALSE |
null | null | Boolean.TRUE |
1.3 equalsIgnoreCase(string1, string2)
公式含义
判断忽略大小写字符串string1是否与字符串string2相等
对应类:nc.vo.pub.formulaset.function.EqualsIgnoreCase
类型返回值表
参数string | 参数end | 返回值 |
java.lang.String | java.lang.String | Integer, 与Java中String类方法equalsIgnoreCase返回结果相同,只不过返回Integer(true对应1,false对应-1) |
null | 除null以外任何对象 | new Integer(-1) |
除null以外任何对象 | null | new Integer(-1) |
null | null | new Integer(1) |
1.4 indexOf(st1, st2)
公式含义
判断字符串st1中第一个字符串st2所在的位置,比如lastIndexOf("HI,UAP2006, UAP","UAP")返回3.
对应类:nc.vo.pub.formulaset.function.IndexOf
类型返回值表
参数st1 | 参数st2 | 返回值 |
java.lang.String | java.lang.String | Integer, 与Java中String类方法indexOf返回结果相同,如果不存在返回-1 |
参数str | 返回值 |
java.lang.String | Boolean;如果str为””,返回Boolean.TRUE,否则返回Boolean.FALSE |
null | Boolean.TRUE |
其他任何对象 | Boolean.FALSE |
1.6 lastIndexOf(st1, st2)
公式含义
判断字符串st1中最后一个字符串st2所在的位置,比如lastIndexOf("HI,UAP2006,UAP","UAP")返回11.
对应类:nc.vo.pub.formulaset.function.LastIndexOf
类型返回值表
参数st1 | 参数st2 | 返回值 |
java.lang.String | java.lang.String | Integer, 与Java中String类方法lastIndexOf返回结果相同,如果不存在返回-1 |
1.7 left(st, index)
公式含义
求字符串st左边前index个字符组成的字符串 对应类:nc.vo.pub.formulaset.function.Left
类型返回值表
参数st | 参数index | 返回值 |
java.lang.String | java.lang.Object(其toString()方法一定要可以parse为int) | java.lang.String, 与Java中String类方法subString(0,index)返回结果相同,如果index>st字符串的长度,抛异常 |
1.8 leftStr(st,len,defaultStr)
公式含义
求字符串st左边前len个字符组成的字符串,如果字符串长度小于len,则用defaultStr补齐,比如leftStr("abc",6,"@")将返回abc@@@.
对应类:nc.vo.pub.formulaset.function.LeftStr
类型返回值表
参数st | 参数len | 参数defaultStr | 返回值 |
java.lang.String,长度不能为0 | java.lang.Object,但其toString()方法要能转换为int值 | java.lang.String,长度不能为0 | java.lang.String,将str的字符串值从左侧进行截取,如果长度不够len,则用defaultStr补齐 |
1.9 length(st)
公式含义
求字符串st的长度
对应类:nc.vo.pub.formulaset.function.Length
类型返回值表
参数st | 返回值 |
java.lang.String | Integer, 与String的length方法返回结果相同 |
null | 0 |
1.10 mid(String st, int start, int end)
公式含义
求字符串st左边前第start个字符至第end个字符之间的字符串
对应类:nc.vo.pub.formulaset.function.Mid
类型返回值表
参数st | 参数start | 参数end | 返回值 |
java.lang.String,长度不能为0 | java.lang.Object,但其toString()方法要能转换为int值 | java.lang.Object,但其toString()方法要能转换为int值 | java.lang.String,与String中的方法subString(start, end) |
1.11 right(String st, int index)
公式含义
求字符串st右边前index个字符组成的字符串 对应类:nc.vo.pub.formulaset.function.Right
类型返回值表
参数st | 参数index | 返回值 |
java.lang.String | java.lang.Object(其toString()方法一定要可以parse为int) | java.lang.String, 与Java中String类方法subString(st.length()-index)返回结果相同,如果index>st字符串的长度,抛异常 |
1.12 rightStr(st,len,defaultStr)
公式含义
求字符串st右边后len个字符组成的字符串,如果字符串长度小于len,则用defaultStr补齐,比如rightStr("abc",6,"@")将返回abc@@@. 对应类:nc.vo.pub.formulaset.function.RightStr
类型返回值表
参数st | 参数len | 参数defaultStr | 返回值 |
java.lang.String,长度不能为0 | java.lang.Object,但其toString()方法要能转换为int值 | java.lang.String,长度不能为0 | java.lang.String,将str的字符串值从右侧进行截取,如果长度不够len,则用defaultStr补齐 |
1.13 startsWith(String st, String start)
公式含义
判断字符串st是否以字符串start开头
对应类:nc.vo.pub.formulaset.function.StartsWith 类型返回值表
参数string | 参数end | 返回值 |
java.lang.String | java.lang.String | java.lang.Double,与Java中String类方法startsWith返回结果相同,只不过返回Boolean |
null | 除null以外任何对象 | Boolean.FALSE |
除null以外任何对象 | null | Boolean.FALSE |
null | null | Boolean.TRUE |
1.14 toLowerCase(String st)
公式含义
求字符串st的小写形式,比如toLowerCase("Abc")返回"abc"。
对应类:nc.vo.pub.formulaset.function.ToLowerCase 类型返回值表
参数st | 返回值 |
java.lang.String | java.lang.String, 与String的toLowerCase方法返回结果相同 |
参数st | 返回值 |
null | java.lang.String, “null” |
nc.vo.pub.formulaset.util.NullZeroNumber | java.lang.String,”” |
其他的java.lang.Object | java.lang.String,返回toString()方法的内容 |
1.16 toUpperCase(String st)
公式含义
求字符串st的大写形式。
对应类:nc.vo.pub.formulaset.function.ToUpperCase
类型返回值表
参数st | 返回值 |
java.lang.String | java.lang.String, 与String的toUpperCase方法返回结果相同 |
参数value | 参数decimal | 返回值 |
java.lang.String | java.lang.Object,但其toString方法要能转换成int值 | 如果String可以直接转成Double,返回具体精度的Double,否则直接返回value。特别地,当value长度为0时返回Double(0.0) |
Double | 同上 | 返回具体精度的Double |
Number | 同上 | 将value转换为double后,再按照精度转换成Double |
任何其他java.lang.Object | 同上 | 直接返回value |
null | 同上 | null |
参数num | 返回值 |
Integer | Integer, 与Math.abs(int)方法返回结果相同 |
Number | Double, 与Math.abs(double)方法返回结果相同 |
nc.vo.formulaset.coretype.Complex | Double,与Complex返回结果相同 |
参数num | 返回值 |
Number | Double, 与Math.acos(double)方法返回结果相同 |
nc.vo.formulaset.coretype.Complex | Double,与Complex.acos():返回结果相同 |
参数num1 | 参数num2 | 返回值 |
Double | null | Double: num1 |
Double | Double:num1+num2 | |
Number | Double:num1+num2 | |
null | Double | Double:num2 |
Number | Double:num1+num2 |
参数num | 返回值 |
Number | Double, 与Math.asin(double)方法返回结果相同 |
Complex | Double,与Complex.asin():返回结果相同 |
参数x | 返回值 |
Number | Double, 与Math.atan(double)方法返回结果相同 |
Complex | Double,与Complex.atan():返回结果相同 |
参数x | 返回值 |
Number | Double, 与Math.cos(double)方法返回结果相同 |
Complex | Double,与Complex.cos():返回结果相同 |
参数num1 | 参数num2 | 返回值 |
Double | null | Double: num1 |
Double | Double:num1.div(num2) | |
Number | Double: num1.div(num2) | |
null | Double | Double:num2 |
Number | Double: num1.div(num2) |
参数x | 返回值 |
Number | Double, 与Math.exp(x.doubleValue())方法返回结果相同 |
Complex | Complex, new Complex(mod*Math.cos(y),mod*Math.sin(y)) |
参数x | 返回值 |
Number | Integer, new Integer(Math.round(x.floatValue())) |
String | Integer, new Integer (Math.round(new Double(x.toString()).floatValue)) |
注:参数不能为null
2.10 ln(x)
公式含义
返回给定数值x的自然对数;
对应类:nc.vo.pub.formulaset.function.NaturalLogarithm
类型返回值表
参数x | 返回值 |
Number | Complex, new Complex(param.doubleValue()).log() |
Complex | Complex, x.log() |
参数x | 返回值 |
Number | Complex, new Complex(x.doubleValue()).log().div(new Complex(Math.log(10), 0)) |
Complex | Complex, x.log().div(new Complex(Math.log(10),0)) |
参数x | 参数y | 返回值 |
Number | Number | Number,x.doubleValue()与y.doubleValue()比较,>返回x,其余返回y |
Comparable | Object | x.compareTo(y) ,>0返回x,<0返回y< td=""> |
Object | Comparable | -y.compareTo(x) ,>0返回x,<0返回y< td=""> |
注:参数不能为null,Comparable:java.lang.Comparable。
2.13 min(x, y)
公式含义
求x,y两者中的最小值;
对应类:nc.vo.pub.formulaset.function.Min
类型返回值表
参数x | 参数y | 返回值 |
Number | Number | Number, x.doubleValue()与y.doubleValue()比较,>返回x,其余返回y |
Comparable | Object | x.compareTo(y)进行比较,>0返回y,<0返回x< td=""> |
Object | Comparable | -y.compareTo(x)进行比较,>0返回y,<0返回x< td=""> |
2.14 mul(num1,num2)
公式含义
用于高精度乘法运算;
对应类:nc.vo.pub.formulaset.function.MultiplyBigNumber
类型返回值表
参数num1 | 参数num2 | 返回值 |
Double | null | Double: num1 |
Double | Double:num1.multiply(num2) | |
Number | Double: num1. multiply (num2) | |
null | Double | Double:num2 |
Number | Double: num1. multiply (num2) |
注:其他情况下,会使用*操作进行运算
2.15 round(double num, int index)
公式含义
对num保留index位小数(四舍五入);
对应类:nc.vo.pub.formulaset.function.Round
类型返回值表
参数x | 参数y | 返回值 |
String | Number | new Double(x).setScale(y,Double.ROUND_HALF_UP) |
Double | Number | new Double(x).setScale(y,Double.ROUND_HALF_UP) |
Number | Number | new Double(x). setScale(y,Double.ROUND_HALF_UP) |
参数num | 返回值 |
Number | Double,判断num.doubleValue()与0之间的关系,>时返回1,=时返回0, <时返回-1< td=""> |
参数num | 返回值 |
Number | new Double(Math.sin(((Number)param).doubleValue())) |
Complex | Complex,((Complex)param).sin() |
参数x | 返回值 |
Number | x.doubleValue()<0,返回new complex(value).sqrt(),即complex;<="" td=""> |
x.doubleValue()<0,返回new double(math.sqrt(x)),即double<="" td=""> | |
Complex | Complex,((Complex)param).sqrt() |
参数num1 | 参数num2 | 返回值 |
Double | null | Double: num1 |
Double | Double:num1-num2 | |
Number | Double:num1-num2 | |
null | Double | Double:num2 |
Number | Double:num1-num2 |
注:其他的情况下,将会用普通-的方式进行运算
2.20 tan(x)
公式含义
返回给定角度x的正切值;
对应类:nc.vo.pub.formulaset.function.Tangent
类型返回值表
参数x | 返回值 |
Number | Double,new Double(Math.tan(((Number)param).doubleValue())) |
Complex | Complex,((Complex)param).tan() |
参数st | 返回值 |
String | st.toString()==null或trim().length()==0,返回new Double(0); |
new Double(st.toString().trim()) | |
Number | Number,st |
参数var | 返回值 |
null | new Double(0) |
String | 如果var.length==0,返回new Double(0) |
其他情况 | var |
参数param | 返回值 |
Number | Complex: new Complex(((Number)param).doubleValue(),0.0).acosh() |
Complex | Complex: ((Complex)param).acosh() |
2.24 angle(x,y)
公式含义
以弧度为单位计算并返回点y/x的角度。
对应类:nc.vo.pub.formulaset.function.Angle
类型返回值表
参数x | 参数y | 返回值 |
Number | Number | Double: new Double(Math.atan2(x.doubleValue(), y.doubleValue())) |
2.25 asinh(param)
公式含义
asinh(z) = log(z + sqrt(z*z + 1))
对应类:nc.vo.pub.formulaset.function.ArcSineH
类型返回值表
参数param | 返回值 |
Number | Complex: new Complex(((Number)param).doubleValue(),0.0).asinh() |
Complex | Complex: ((Complex)param).asinh() |
2.26 atanh(param)
公式含义
asinh(z) = log(z + sqrt(z*z + 1))
对应类:nc.vo.pub.formulaset.function.ArcTanH
类型返回值表
参数param | 返回值 |
Number | Complex: new Complex(((Number)param).doubleValue(),0.0).atanh() |
Complex | Complex: ((Complex)param).atanh() |
2.27 cosh(param)
公式含义
cosh(z) = ( exp(z) + exp(-z) ) / 2
对应类:nc.vo.pub.formulaset.function.CosineH
类型返回值表
参数param | 返回值 |
Number | Double: new Double((Math.exp(param.doubleValue()) + Math.exp(-value))/2) |
Complex | Complex: ((Complex)param).cosh() |
2.28 mod(x, y)
公式含义
求模运算
对应类:nc.vo.pub.formulaset.function.Modulus
类型返回值表
参数x | 参数y | 返回值 |
Integer | Integer | Integer: x.intValue()%y.intValue() |
Number | Number | Double: x.doubleValue()%y.doubleValue() |
2.29 rand()
公式含义
生成随机数
对应类:nc.vo.pub.formulaset.function.Random
类型返回值 返回new Double(Math.random())
2.30 sinh(param)
公式含义
sinh(z) = ( exp(z) - exp(-z) ) / 2
对应类:nc.vo.pub.formulaset.function.SineH
类型返回值表
参数param | 返回值 |
Number | Double: new Double((Math.exp(param.doubleValue()) - Math.exp(-value))/2) |
Complex | Complex: ((Complex)param).sinh() |
2.31 sum(x,y)
公式含义
计算两个数的和
对应类:nc.vo.pub.formulaset.function.Sum
类型返回值表
参数x | 参数y | 返回值 |
Integer | Integer | Integer |
Number | Number | Number |
2.32 tanh(param)
公式含义
tanh(z) = sinh(z) / cosh(z)
对应类:nc.vo.pub.formulaset.function.TanH
类型返回值表
参数param | 返回值 |
Number | Double: value=param.doubleValue(); new Double((Math.exp(value)-Math.exp(-value))/ (Math.pow(Math.E,value) +Math.pow(Math.E,-value))) |
Complex | Complex: ((Complex)param).tanh() |
自定义公式扩展说明
公式提供自定义函数功能。自定义函数配置文件目录如下:
WEB-INF\classes\formulaconfig
配置文件格式如下:
<?xml version="1.0" encoding="utf-8"?>
<formula-array>
<formula>
<customType>0</customType>
<functionName>FORMATADDRESS</functionName>
<functionClass>nc.ui.bd.pubinfo.address.FormatAddress</functionClass>
</formula>
</formula-array>
自定义公式的实现方法可以参见nc.vo.pub.formulaset.function.Max这个类