历史版本12 :除数被除数为零的处理 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 概述编辑

1.1 问题描述

在报表设计时,若使用除法运算,可能涉及到「除数」或「被除数」为 0 的情况,此时默认 FineReport 的计算规则如下表所示:

被除数
除数
0非 00
非 00∞ 或 -∞
000

这样显示没有错,但在实际应用中,经常需要对「除数为 0 」或者「除数被除数均为 0」 的情况进行处理,希望在这两种情况下提示「无法计算」或避免结果为「无穷大」。如下图所示:

1617245188914991.png

1.2 解决思路

  • 使用 IF 公式判断除数与被除数是否均为 0,为 0 时提示“can’t caculate”。

  • 使用「条件属性新值」修改结果为「无穷大」的值。

2. 示例编辑

2.1 准备数据

新建普通报表,新建内置数据集 Embedded1,添加「被除数」和「除数」两个「整数」类型的字段,填入一些整数,如下图所示:
Snag_a903364.png

2.2 设计报表

将「被除数」和「除数」分别拖入 A2、B2 单元格,将 A2 单元格的「数据设置」修改为「列表」。在 C2 单元格插入「商」的公式:A2/B2。表格样式如下图所示:

此时预览报表,是使用 FineReport 默认的计算规则。结果如下图所示:
Snag_a9348e1.png

2.3 设置公式

2.3.1 被除数与除数均为 0

被除数和除数均为 0 时,实际应用中除数显示“can’t caculate”,否则计算 A2/B2。此时可将 C2 单元格的公式改为:IF(A2=0&&B2=0,"can't caculate",A2/B2),结果如下图所示:

Snag_aad7d21.png

2.3.2 除数为 0

除数为 0 时,商为「无穷大」,希望不需要计算,否则计算 A2/B2,可使用公式:IF(B2=0,"0",A2/B2),结果就显示为 0 了。在本例中,可将 C2 单元格的公式修改为:IF(A2=0&&B2=0,"can't caculate",IF(B2=0,"0",A2/B2))。结果如下图所示:

Snag_ab4a8e3.png

2.4 设置条件属性新值 

当商为「无穷大」时,无穷大 ∞ 对应的真实值其实是 Infinity ,可以利用「条件属性>新值」改变单元格值。

注:Infinity 首字母必须大写,小写无效。

选中 C2 单元格,点击右侧属性面板,添加一个条件属性,选择「新值」属性,设置值为「字符串」 0 (可根据情况选择其他值类型)。添加两个「普通」条件,用 OR 连接,即当单元格值为 Infinity (∞)或 -Infinity (-∞)时,单元格值改变为 0。

如下图所示:

1617246660851488.png

这样做的一个好处是利用条件属性可以批量设置,也就是说在模板中出现多个可能计算结果为无穷大的地方,我们只需要全部选中,右键选择条件属性,即可以一次性设置成功,不需要反复利用 IF 公式来判断了,可以省下很多时间,大大提高我们的开发效率。

2.5 效果预览

2.5.1 PC 端

保存模板,效果与 1.1 节中相同。

2.5.2 移动端

App 与 HTML5 端效果相同,如下图所示:


3. 模板下载编辑

已完成模板可参见:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\SpecialSubject\除数被除数为零时的处理.cpt

点击下载模板:除数被除数为零时的处理.cpt