在jasper报告中将字符串格式化为货币格式

时间:2012-06-06 11:40:37

标签: java string formatting jasper-reports

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

我希望以数百个逗号分隔的方式格式化它,并且数字前面有$美元符号。

e.g。 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,但后来比较运算符?=无效。

如果货币值不可用,我想在报告上打印“不可用”而不是默认的“空”。否则,我希望如上所述正确格式化数字。

如何解决此问题?

感谢阅读。

7 个答案:

答案 0 :(得分:35)

正确的表达方式是:

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

java.lang.Integer java.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*

<强> 注意: 您还应该添加check for null。

您还可以使用 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>

结果将是相同的。

答案 1 :(得分:3)

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

  1. 在小数点后固定两个零。当我为此目的尝试使用“Double”数据类型时,它对我不起作用。但是这段代码可以做到。
  2. 修复字母数据类型中的数字之前的$ -sign,并自行处理“ - ”符号。
  3. 在数字中的3位数后获取“,”
  4. 对于我,我想在每三个数字后面加上“,”逗号(通过传递字符串作为参数),我尝试了以下代码。它对我有用....非常感谢你。我很欣赏这个答案。

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

答案 2 :(得分:1)

刚刚遇到这个问题并找到了一个适合我的解决方案。

要注意 - 它不是Autor所要求的,但如果你谷歌这个问题,你将会到这里来。

我有德语和英语区域设置的服务器,所有货币应该像7.500,60

我的最后一句话:

new java.text.DecimalFormat("#,##0.00", new java.text.DecimalFormatSymbols(java.util.Locale.GERMANY)).format($F{variable}) + " €"

所以区域设置是&#34;硬编码&#34; - 正是我需要的。

也许这会帮助某人

答案 3 :(得分:0)

我正在使用iReport 5.6.0,我采取了一些这些答案,但它对我有用的是:

Text Field(我把它放到设计师中):

Float.valueOf($V{DISPONIBLE_FINAL})

在Pattern(进入属性选项卡)中,我使用自定义格式:

$#,##0.00

将这里提到的所有字符串放在一个完整的&#34;编辑表达式&#34;这个领域对我没用。

希望它有所帮助。

PD:我使用的groovy jar与mvnrepository网站上检查的jasper 5.6.0兼容。

答案 4 :(得分:0)

在iReport中尝试推荐的答案时,我得到了“美元符号后的非法字体符号”;当我报告时。

通过像这样的反斜杠逃避美元符号来轻松补救:

new java.text.DecimalFormat("\$ #,##0.00").format(Double.valueOf($F{le1_feeAmount}))

答案 5 :(得分:0)

您也可以使用iReport Studio执行此操作。 在工作室中单击该字段并查看属性窗格。在文本字段属性下的属性窗格中,您将找到模式属性。粘贴#,## 0.00 或点击三个点并勾选弹出菜单中的复选框,以便在1000处分开。

答案 6 :(得分:0)

问题是语言环境,这对我有用:

     new java.text.DecimalFormat("#,##0.00", new DecimalFormatSymbols(Locale.ENGLISH)).format(Double.valueOf($F{7}))