一、问题场景
打印业务单据时,需要用到四则运算(加减乘除),或者需要添加判断来达到打印目的
二、操作步骤
1、BigDecimal类的常用函数说明(BigDecimal类很重要,常常用于金额和数量,而金额和数量通常需要进行各种操作)
以3.0的调入单报表为例,首先打开调入单报表,选中一个类型为BigDecimal类的属性(Field),比如零售价,选中零售价右键第一个选项(Edit expression),或者在报表右侧的属性栏中点击
Text Field Exprssion,然后出现弹出框,在弹出框中选中左侧属性(Field), 然后在中间区域选中零售价(inOrderDetailSalePrice),然后在右侧可以看到很多函数(方法),下面拣常用的进行说明。
如图:,如果在ireport右侧找不到属性栏,则可以点击窗口,单击属性就可以出现。
add( java.math.BigDecimal ) 加法。例如 $F{inOrderDetailSalePrice}.add(3) 或者 $F{inOrderDetailSalePrice}.add(new BigDecimal(3)) 表示零售价 加 三;
$F{inOrderDetailSalePrice}.add($F{inOrderDetailPrice}) 表示零售价 加 基本单价;(注:此时运算结果还是BigDecimal类型(或者说返回值还是BigDecimal类型),使用ireport格式编辑即可拿到你需要的格式,不需要通过其他方法调整数据的格式)。add( java.math.BigDecimal, java.math.MathContext )) 加法(含精确位数)。 $F{inOrderDetailSalePrice}.add(3, new MathContext(5, RoundingMode.HALF_UP)),表示,采用四舍五入方式,计算结果精确位数为5(第一个不为0的数开始计算精确度)。
equals( Object ) 判断两个数据是否相等。$F{inOrderDetailSalePrice}.equals(3) 表示零售价是否为3。打印效果为true或者false。返回值boolean类型。
(一般比较两个数,使用 compareTo方法,下面会讲到)。toString() 转化字符串。$F{inOrderDetailSalePrice}.toString(),将零售价转换为字符串。多数情况下会自动调用,用处不大。返回值是String类型。
abs() 取绝对值。$F{inOrderDetailSalePrice}.abs(),取零售价的绝对值。返回值BigDecimal类型。
abs( java.math.MathContext ) 取绝对值(含精确度)。$F{inOrderDetailSalePrice}.abs(new MathContext(5)),表示计算结果精确位数为5(第一个不为0的数开始计算精确度)。返回值是BigDecimal类型。
pow( int) 幂函数,即计算某数的几次方。$F{inOrderDetailSalePrice}.pow( 3 ),即零售价的3次方;new BigDecimal(2).pow( 5 ),2的5次方,结果为32。返回值是BigDecimal类型。
pow( int, java.math.MathContext ) 幂函数(含精确度)。$F{inOrderDetailSalePrice}.pow( 3 ,new MathContext(5)),表示计算结果精确位数为5。返回BigDecimal。
min( java.math.BigDecimal ) 取两个数中较小的一个。$F{inOrderDetailSalePrice}.min($F{inOrderDetailPrice}),表示取零售价和基本单价中较小的一个数。返回BigDecimal。
max( java.math.BigDecimal ) 取两个数中较大的一个。$F{inOrderDetailSalePrice}.min($F{inOrderDetailPrice}),表示取零售价和基本单价中较大的一个数。返回BigDecimal。
compareTo( java.math.BigDecimal ) 比较两个数的大小,大于返回1,小于返回-1,等于返回0。通常可以这样使用$F{inOrderDetailSalePrice}.compareTo($F{inOrderDetailPrice}) >=0 ? "大于等于" : "小于",表示:
零售价是否大于等于基本单价,如果是,则打印出 大于等于 的文字,反之打印出 小于。compareTo( Obejct ) 比较两个数的大小。同上(必须是两个数字之间的比较)。
intValue() 取整,小数部分一律去掉,不进行四舍五入等之类的操作。$F{inOrderDetailSalePrice}.intValue(),对零售金额进行取整。
longValue() 取得该数字的长整型,长整型的范围比整形大。$F{inOrderDetailSalePrice}.longValue()。
floatValue() 取得该数字的浮点类型,含小数点部分。$F{inOrderDetailSalePrice}.floatValue()。比如new BigDecimal(3).floatValue(),结果为3.00。
doubleValue() 取得该数字的双精度类型,含小数点部分,双精度类型数字范围比浮点型大,精确度也大。$F{inOrderDetailSalePrice}.doubleValue()。new BigDecimal(3).doubleValue(),结果为3.00。
valueOf(long) 将长整型数字转换为零标度的BigDecimal类型。BigDecimal.valueOf(333333) ,结算仍是333333。(无多大用处)。
valueOf(long, int) 意义和用法和上一个无多大区别。
valueOf(double) 意义和用法和上一个无多大区别。
signum() 返回该数值的符号(即根据该数的值是正、零或负返回 1 、 0 或 -1 )。$F{inOrderDetailSalePrice}.signum()。
round(java.math.MathContext) 根据MathContext的精确度进行四舍五入。$F{inOrderDetailSalePrice}.round(new MathContext(3)) ,对零售价进行四舍五入,精确位数为三,第一个不为0的数开始计算精确度。
比如:new BigDecimal(26.295).round(new MathContext(3)) 的结果为26.3。ulp() 返回此BigDecimal的ulp(最后一位的单位)的大小。new BigDecimal(65.29).ulp()的值为1E-46。
scale() 返回此BigDecimal的精度。$F{inOrderDetailSalePrice}.scale()。
divide( java.math.BigDecimal) 除法。$F{inOrderDetailSalePrice}.divide($F{inOrderDetailPrice}),零售价除以基本单价。 new BigDecimal(9).divide(3.2) 的结果为2.8125。
注意:写成$F{inOrderDetailSalePrice}.divide($F{inOrderDetailPrice}) 或者 new BigDecimal(9).divide(new BigDecimal(3.2) 的形式会抛异常,这是因为当除法(divide)两边的数无法整除,
而这种写法又没有指定计算精度,所以运行报错,或者ireport编译通不过,所以应当尽量不使用这种除法的方法divide( java.math.BigDecimal)。divide( java.math.BigDecimal, int ) 除法。$F{inOrderDetailSalePrice}.divide($F{inOrderDetailPrice},RoundingMode.HALF_UP),零售价除以基本单价,四舍五入,保留到个位数。divide( java.math.BigDecimal, int ) 方法,
默认有效位数保留到个位数,RoundingMode有多种取舍方式,最常见的是四舍五入(RoundingMode.HALF_UP)。divide( java.math.BigDecimal, int, java.math.RoundingMode ) 除法。$F{inOrderDetailSalePrice}.divide($F{inOrderDetailPrice}, 2 , RoundingMode.HALF_UP),零售价除以基本单价,四舍五入,保留小数点后两位数。
此方法在除法中比较常用。例如new BigDecimal(9).divide(new BigDecimal(3.7), 5, RoundingMode.HALF_UP)),结果为2.43。divide( java.math.BigDecimal, java.math.RoundingMode ) 除法。
divide( java.math.BigDecimal, java.math.MathContext ) 除法。
divide( java.math.BigDecimal, int, int ) 除法。
multiply( java.math.BigDecimal, java.math.MathContext ) 乘法。$F{inOrderDetailSalePrice}.multiply($F{inOrderDetailPrice}, new MathContext(5, RoundingMode.HALF_UP)),零售价乘以基本单价,
四舍五入,计算结果精确位数为5(第一个不为0的数开始计算精确度)。multiply( java.math.BigDecimal) 乘法。$F{inOrderDetailSalePrice}.multiply($F{inOrderDetailPrice}),零售价乘以基本单价。
negate() 返回此对象的相反数。$F{inOrderDetailSalePrice}.negate()。
negate( java.math.MathContext ) 返回此对象的相反数。new BigDecimal(3.723).negate(new MathContext(3, RoundingMode.HALF_UP)))的值为-3.72。
subtract( java.math.BigDecimal ) 减法。$F{inOrderDetailSalePrice}.subtract(new BigDecimal(3)),零售价减3。
subtract( java.math.BigDecimal, java.math.MathContext ) 减法。$F{inOrderDetailSalePrice}.subtract($F{inOrderDetailPrice} , new MathContext(3, RoundingMode.HALF_UP)),零售价减去基本单价,四舍五入,精确位数为三,
第一个不为0的数开始计算精确度。remainder( java.math.BigDecimal ) 返回一个数除以另一个数的余数。$F{inOrderDetailSalePrice}.remainder(new BigDecimal(3)),零售价除以3的余数。
remainder( java.math.BigDecimal, java.math.MathContext ) 返回一个数除以另一个数的余数,有精确度。$F{inOrderDetailSalePrice}.remainder(new BigDecimal(3,new MathContext(3, RoundingMode.HALF_UP)))。
precision() 返回此BigDecimal的精度。
movePointLeft (int) 将一个数的小数点向左移。例如:new BigDecimal(378).movePointLeft(2)的值为3.78。
movePointRight (int) 将一个数的小数点向右移。例如:new BigDecimal(3.78).movePointRight(2)的值为378。
setScale( int, java.math.RoundingMode ) 指定一个数的保留小数位数,和以什么方式保留。new BigDecimal(9.4565).setScale(2,BigDecimal.ROUND_HALF_UP),四舍五入,保留两位小数,结果为9.46。
2、在ireport中如何使用 “ if ” 判断语句?
同样,我们以3.0的盘点差异单报表的属性为例:比如 “ 处理 ” 这一列就用到了 “ if ” 判断,处理属性列的 Text Field Expression 是这样写的:$F{checkOrderDetailSynchronized}? "是":"" ,
首先checkOrderDetailSynchronized是Boolean类型,就可以直接判断,这句脚本的意思就是,判断处理的属性checkOrderDetailSynchronized是否为真,为真的话就打印 是,为假的话就什么都不打印;
再举个例子 $F{checkOrderDetailCause} == null ? "" : $F{checkOrderDetailCause},其中checkOrderDetailCause表示差异原因,为String类型,这句脚本的意思,判断差异原因checkOrderDetailCause是否为空,
是的话就什么都不打印,不是的话,就打印出差异原因;
从上述两个例子不难看出在ireport的 if 判断的格式为:condition ? exp1 : exp2 ;其中问号前面的condition表示要判断的情形,冒号前的 exp1 表示情况condition为真时的结果,冒号后的 exp2 表示情况condition为假时的结果,
比如 3 > 2 ? "真的" : "假的" ; 则表示判断 3>2 的情况是否是真的,如果是真的,就输出 真的 两个字,如果是假的,就输出 假的 两个字,那么 3 > 2 必然是真的,所以输出的结果就是 真的 。
三、注意事项
暂无