将字符串的格式设置为 jasper 报表中的货币格式

2022-09-02 11:37:07

我有一个带有一些数值的字符串。

我想以一种以逗号分隔的方式格式化它,并且数字之前有$ 美元符号。

例如,12345 应格式化为 $ 12,345.00

我尝试了以下没有美元符号的代码:

new java.text.DecimalFormat(#,##0.00).format.(myString)

和下面那个带有美元符号的:

new java.text.DecimalFormat($ #,##0.00).format.(myString)

但是,两者都给出了错误。

实现这种格式的正确方法是什么?

这是jasper report jrxml的一部分,我想避免在报表上“null”,从而插入以下代码:

<textField isBlankWhenNull="false" isStretchWithOverflow="true">            
  <reportElement stretchType="RelativeToTallestObject" x="1350" y="0" width="150" height="30"/>             
      <textElement/>             
   <textFieldExpression class="java.math.BigDecimal"><![CDATA[$F{myString}!=null?new java.text.DecimalFormat(#,##0.00).format.($F{myString}):"Unavailable"]]></textFieldExpression>        
</textField>

其中 myString 来自查询,并在 jrxml 中声明为:

 <field name="myString" class="java.lang.String"/>

早些时候,myString 被声明为 BigDecimal,但随后比较运算符 ?= 不起作用。

如果货币值不可用,我想在报表上打印“不可用”,而不是默认的“null”。否则,我希望按照上述方式正确设置数字格式。

如何解决此问题?

感谢您的阅读。


答案 1

正确的表达式是:

new java.text.DecimalFormat("$ #,##0.00").format(Double.valueOf($P{strParam}))

java.lang.Integerjava.lang.String 的工作示例:

<?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_as_current" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <parameter name="intParam" class="java.lang.Integer">
        <defaultValueExpression><![CDATA[12345678]]></defaultValueExpression>
    </parameter>
    <parameter name="strParam" class="java.lang.String">
        <defaultValueExpression><![CDATA["12345678.95"]]></defaultValueExpression>
    </parameter>
    <title>
        <band height="79" splitType="Stretch">
            <textField>
                <reportElement x="137" y="18" width="291" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[new java.text.DecimalFormat("$ #,##0.00").format($P{intParam})]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="137" y="48" width="291" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[new java.text.DecimalFormat("$ #,##0.00").format(Double.valueOf($P{strParam} != null && $P{strParam}.length() > 0 ? Double.valueOf($P{strParam}) : 0))]]></textFieldExpression>
            </textField>
        </band>
    </title>
</jasperReport>

结果将是(在 iReport 中预览):

The result in *iReport*

注意:您还应该添加对空值的检查。

还可以使用 textField模式属性来设置数据格式。

示例:

<?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_as_current" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <parameter name="intParam" class="java.lang.Integer">
        <defaultValueExpression><![CDATA[12345678]]></defaultValueExpression>
    </parameter>
    <parameter name="strParam" class="java.lang.String">
        <defaultValueExpression><![CDATA["12345678.95"]]></defaultValueExpression>
    </parameter>
    <title>
        <band height="148" splitType="Stretch">
            <textField pattern="$ #,##0.00">
                <reportElement x="218" y="99" width="100" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[$P{intParam}]]></textFieldExpression>
            </textField>
            <textField pattern="$ #,##0.00">
                <reportElement x="218" y="119" width="100" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[$P{strParam} != null && $P{strParam}.length() > 0 ? Double.valueOf($P{strParam}) : 0]]></textFieldExpression>
            </textField>
        </band>
    </title>
</jasperReport>

结果将是相同的。


答案 2

上述代码适用于三种情况:

  1. 修复小数点后两个零。当我尝试为此目的使用“双重”数据类型时,它对我不起作用。但是这个代码可以做到这一点。
  2. 修复字符串数据类型中数字前的 $ -符号,并处理其自身中的“-”符号。
  3. 在数字的 3 位数字之后获取 “,”

对我来说,我想在每三个数字之后放“”,“逗号”(通过将字符串作为参数传递),我尝试了以下代码。它确实对我有用...谢谢。我很欣赏这个答案。

<textFieldExpression>

<![CDATA[new java.text.DecimalFormat("$ #,##0.00").format(Double.valueOf($P{actualWrittenPremium} != null && $P{actualWrittenPremium}.length() > 0 ? Double.valueOf($P{actualWrittenPremium}) : 0))]]>

</textFieldExpression>