使用 Jasper 在逗号后将 Double 格式化为带有两个数字的字符串

Formatting a Double to a String with two numbers after the coma using Jasper

我有一个 jrxml 文件,其中有两个 Double 值,它们想在昏迷后用两个数字格式化为字符串,所以这是我的字段

<field name="montantRachat" class="java.lang.Double">
        <fieldDescription><![CDATA[montantRachat]]></fieldDescription>
</field>
<variable name="total" class="java.lang.Double" calculation="Sum">
        <variableExpression><![CDATA[$F{montantRachat}]]></variableExpression>
        <initialValueExpression><![CDATA[new Double(0)]]></initialValueExpression>
</variable>

我想将它们格式化为字符串

<variable name="totalString" class="java.lang.String">
        <variableExpression><![CDATA[(new DecimalFormat("#,###,##0.00")).format($V{total})]]></variableExpression>
</variable>
<variable name="montantRachatString" class="java.lang.String">
        <variableExpression><![CDATA[(new DecimalFormat("#,###,##0.00")).format($F{montantRachat})]]></variableExpression>
</variable>

但是我遇到了这个异常

net.sf.jasperreports.engine.JRException: net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression : 
    Source text : (new DecimalFormat("#,###,##0.00")).format($V{total})

    at com.jaspersoft.studio.editor.preview.view.control.ReportControler.fillReport(ReportControler.java:466)

    at com.jaspersoft.studio.editor.preview.view.control.ReportControler.access(ReportControler.java:441)

    at com.jaspersoft.studio.editor.preview.view.control.ReportControler.run(ReportControler.java:333)

    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)

Caused by: net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression : 
    Source text : (new DecimalFormat("#,###,##0.00")).format($V{total})

    at net.sf.jasperreports.engine.fill.JREvaluator.evaluateEstimated(JREvaluator.java:327)

    at net.sf.jasperreports.engine.fill.JRCalculator.evaluateEstimated(JRCalculator.java:602)

    at net.sf.jasperreports.engine.fill.JRCalculator.estimateVariables(JRCalculator.java:201)

    at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:1261)

    at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:1235)

    at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1614)

    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:150)

    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:963)

    at net.sf.jasperreports.engine.fill.BaseFillHandle$ReportFiller.run(BaseFillHandle.java:120)

    at java.lang.Thread.run(Unknown Source)

Caused by: java.lang.IllegalArgumentException

    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

    at java.lang.reflect.Method.invoke(Unknown Source)

    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoCachedMethodSite.invoke(PojoMetaMethodSite.java:189)

    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:53)

    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)

    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)

    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)

    at ORV45rapport45pdf_subreport_1490866646896_381083.evaluateEstimated(calculator_ORV45rapport45pdf_subreport_1490866646896_381083:355)

    at net.sf.jasperreports.engine.fill.JREvaluator.evaluateEstimated(JREvaluator.java:314)

    ... 9 more

我是不是漏掉了什么?

这是一种更简单的方法。您可以创建一个 TextField 并将其模式设置为 #,##0.00#.

,而不是创建另一个 String 类型的 variable 来格式化和显示数字
<textField pattern="#,##0.00#">
    <reportElement x="455" y="0" width="100" height="30"/>
    <textFieldExpression><![CDATA[$V{total}]]></textFieldExpression>
</textField>