JaperReport 常用函数说明
最后更新于 2024/10/23   阅读数 30

一、问题场景 

打印业务单据时,需要用到四则运算(加减乘除),或者需要添加判断来达到打印目的

二、操作步骤

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 必然是真的,所以输出的结果就是 真的 。

三、注意事项

暂无

四、更多相关内容

未能解决您的问题?请联系
本篇目录

一、问题场景 

二、操作步骤

三、注意事项

四、更多相关内容