【问题标题】:formatting a string to a currency format in jasper report在碧玉报告中将字符串格式化为货币格式
【发布时间】:2012-06-10 10:13:52
【问题描述】:

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

我想将其格式化为数百以逗号分隔,并且数字前面带有 $ 美元符号。

例如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,但后来比较运算符 ?= 不起作用。

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

如何解决这个问题?

感谢阅读。

【问题讨论】:

    标签: java string formatting jasper-reports


    【解决方案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中预览):

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

    您还可以使用 textFieldpattern 属性来格式化数据。

    样本:

    <?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>
    

    结果是一样的。

    【讨论】:

    • 谢谢亚历克斯,试试看!
    • Double.valueOf 给出错误“ expected”...我发现了这个 -“如果您使用 jasper 报告外部的库,您需要指定编译类路径”--- 但可以不知道如何实现它!
    • 您使用什么工具来测试报告(iReport 或其他)?您是否将报告的语言设置为 Java
    • Alex 你应该建议使用模式在 xls 导出(作为数字)中获得正确的结果,反转方法??
    • 为什么货币值不适用于 Jasper 的当前语言环境?
    【解决方案2】:

    上面的代码适用于三种情况:

    1. 修正小数点后的两个零。当我尝试为此目的使用“Double”数据类型时,它对我不起作用。但是这段代码可以做到。
    2. 在字符串数据类型中的数字前修复 $ -sign,并且自己处理“-”符号。
    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>
    

    【讨论】:

      【解决方案3】:

      刚刚遇到这个问题并找到了一个对我来说很好的解决方案。

      请注意 - 这不是 Autor 所要求的,但如果你用谷歌搜索这个问题,你会在这里结束。

      我有德语和英语语言环境的服务器,所有货币都应该像7.500,60

      我最后的表达:

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

      所以语言环境设置是“硬编码的”——正是我需要的。

      也许这会对某人有所帮助

      【讨论】:

      • 如果那边没有给出国家语言环境定义?怎么做呢?例如,印度尼西亚未在 java.util.Locale 中列出。 @Frankstar
      • @gumuruh 你可以使用新的 java.util.Locale,例如:对于巴西,我使用 new java.util.Locale("pt", "BR")
      【解决方案4】:

      我正在使用 iReport 5.6.0,我接受了其中一些答案,但它对我有用的是:

      文本字段(我把这个放到设计器中):

      Float.valueOf($V{DISPONIBLE_FINAL})
      

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

      $#,##0.00
      

      将这里提到的所有字符串放在整个“编辑表达式”字段中对我来说不起作用。

      希望对您有所帮助。

      PD:我使用的是与 mvnrepository 站点中检查的 jasper 5.6.0 兼容的 groovy jar。

      【讨论】:

        【解决方案5】:

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

        通过使用如下反斜杠转义美元符号可以轻松解决:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

            • 使用 StackOverflow 编辑器中可用的文本格式选项来提高答案的可读性。
            【解决方案8】:

            使用DecimalFormat 不是最佳选择。对于格式化货币,我们应该使用NumberFormat。使用NumberFormat,我们更加灵活;我们可以动态设置当前语言环境,货币会自动适应所选语言环境。

            <![CDATA[ NumberFormat.getCurrencyInstance($P{REPORT_LOCALE}).format($F{price}) ]]>
            

            我们可以用REPORT_LOCALE参数设置语言环境

            def params = [REPORT_LOCALE: new Locale("sk", "SK")]
            def jrPrint = JasperFillManager.fillReport(jrReport, params, ds)
            

            或使用net.sf.jasperreports.default.locale 属性。

            net.sf.jasperreports.default.locale=sk_SK
            

            有关工作示例,请参阅 https://zetcode.com/jasperreports/formatcurrency/

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-03-08
              相关资源
              最近更新 更多