本文介绍了如何在Jasper Reports中为十进制数指定RoundingMode的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Java与Jasper Reports,并希望使用此格式掩码格式化十进制值#,## 0.00。乍一看,所有看起来都很好,但我发现我的小数值是使用 RoundingMode.HALF_EVEN 舍入模式舍入的,这在我的情况下是不正确的。

I'm using Java with Jasper Reports and would like to format a decimal value using this format mask "#,##0.00". At the first sight all looks fine, but I found that my decimal values are rounded using RoundingMode.HALF_EVEN rounding mode and this is not correct in my case.

这是否可以指定其他舍入模式(我需要 HALF_DOWN 模式)?

Is this possible to specify an other rounding mode (I need HALF_DOWN mode)?

推荐答案

您可以使用 scriptlets机制


  • Java类

package utils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

public class RoundingHelper {

    public static String round(BigDecimal value, RoundingMode mode, String pattern) {
        DecimalFormat format = new DecimalFormat(pattern);
        format.setRoundingMode(mode);
        return format.format(value);
    }
}




  • 报告的模板:

  • <?xml version="1.0" encoding="UTF-8"?>
    <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="format_decimal" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
        <import value="utils.RoundingHelper"/>
        <queryString>
            <![CDATA[SELECT id, (cost/10) as cost from product]]>
        </queryString>
        <field name="ID" class="java.lang.Integer"/>
        <field name="COST" class="java.math.BigDecimal"/>
        <columnHeader>
            <band height="50">
                <staticText>
                    <reportElement x="0" y="0" width="154" height="50"/>
                    <box leftPadding="10">
                        <topPen lineWidth="1.0"/>
                        <leftPen lineWidth="1.0"/>
                        <bottomPen lineWidth="1.0"/>
                        <rightPen lineWidth="1.0"/>
                    </box>
                    <textElement textAlignment="Center" verticalAlignment="Middle">
                        <font isBold="true"/>
                    </textElement>
                    <text><![CDATA[Original value]]></text>
                </staticText>
                <staticText>
                    <reportElement x="154" y="0" width="191" height="50"/>
                    <box leftPadding="10">
                        <topPen lineWidth="1.0"/>
                        <leftPen lineWidth="1.0"/>
                        <bottomPen lineWidth="1.0"/>
                        <rightPen lineWidth="1.0"/>
                    </box>
                    <textElement textAlignment="Center" verticalAlignment="Middle">
                        <font isBold="true"/>
                    </textElement>
                    <text><![CDATA[Using RoundingMode.HALF_DOWN]]></text>
                </staticText>
                <staticText>
                    <reportElement x="345" y="0" width="191" height="50"/>
                    <box leftPadding="10">
                        <topPen lineWidth="1.0"/>
                        <leftPen lineWidth="1.0"/>
                        <bottomPen lineWidth="1.0"/>
                        <rightPen lineWidth="1.0"/>
                    </box>
                    <textElement textAlignment="Center" verticalAlignment="Middle">
                        <font isBold="true"/>
                    </textElement>
                    <text><![CDATA[Using RoundingMode.HALF_DOWN]]></text>
                </staticText>
            </band>
        </columnHeader>
        <detail>
            <band height="20" splitType="Stretch">
                <textField pattern="#,##0.000000000000">
                    <reportElement x="0" y="0" width="154" height="20"/>
                    <box leftPadding="10">
                        <topPen lineWidth="1.0"/>
                        <leftPen lineWidth="1.0"/>
                        <bottomPen lineWidth="1.0"/>
                        <rightPen lineWidth="1.0"/>
                    </box>
                    <textElement/>
                    <textFieldExpression class="java.math.BigDecimal"><![CDATA[$F{COST}]]></textFieldExpression>
                </textField>
                <textField>
                    <reportElement x="154" y="0" width="191" height="20"/>
                    <box leftPadding="10">
                        <topPen lineWidth="1.0"/>
                        <leftPen lineWidth="1.0"/>
                        <bottomPen lineWidth="1.0"/>
                        <rightPen lineWidth="1.0"/>
                    </box>
                    <textElement/>
                    <textFieldExpression class="java.lang.String"><![CDATA[RoundingHelper.round($F{COST}, RoundingMode.HALF_DOWN, "#,##0.")]]></textFieldExpression>
                </textField>
                <textField>
                    <reportElement x="345" y="0" width="191" height="20"/>
                    <box leftPadding="10">
                        <topPen lineWidth="1.0"/>
                        <leftPen lineWidth="1.0"/>
                        <bottomPen lineWidth="1.0"/>
                        <rightPen lineWidth="1.0"/>
                    </box>
                    <textElement/>
                    <textFieldExpression class="java.lang.String"><![CDATA[RoundingHelper.round($F{COST}, RoundingMode.HALF_UP, "#,##0.")]]></textFieldExpression>
                </textField>
            </band>
        </detail>
    </jasperReport>
    




    • 结果将是(预览 iReport

      • The result will be (preview in iReport)
      • 另一种方法是使用 方法(对于 double 字段):

        Another way is to use BigDecimal.setScale(int, java.math.RoundingMode) method (for double field):

        <textFieldExpression class="java.lang.String"><![CDATA[new BigDecimal($F{COST}).setScale(0, BigDecimal.ROUND_HALF_DOWN).toString()]]></textFieldExpression> 
        

        或仅(对于 BigDecimal 字段):

        <textFieldExpression class="java.lang.String"><![CDATA[$F{COST}.setScale(0, BigDecimal.ROUND_HALF_DOWN).toString()]]></textFieldExpression> 
        






        有关 scriptlets的更多信息 in JR Scriptlets

        这篇关于如何在Jasper Reports中为十进制数指定RoundingMode的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-16 11:30