19

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

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

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

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

如何解决这个问题?

谢谢阅读。

4

8 回答 8

42

正确的表达是:

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中预览):

*iReport* 中的结果

注意: 您还应该添加对 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>

结果将是相同的。

于 2012-06-06T12:07:58.967 回答
3

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

  1. 修正小数点后两个零。当我尝试为此目的使用“双”数据类型时,它对我不起作用。但是这段代码可以做到。
  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>
于 2012-10-16T19:16:14.303 回答
3

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

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

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

我最后的表达:

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

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

也许这会帮助某人

于 2016-12-02T18:33:07.703 回答
1

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

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

Float.valueOf($V{DISPONIBLE_FINAL})

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

$#,##0.00

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

希望能帮助到你。

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

于 2015-01-22T20:06:00.880 回答
0

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

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

new java.text.DecimalFormat("\$ #,##0.00").format(Double.valueOf($F{le1_feeAmount}))
于 2015-05-14T17:04:29.550 回答
0

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

于 2018-03-20T19:27:39.433 回答
0

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

     new java.text.DecimalFormat("#,##0.00", new DecimalFormatSymbols(Locale.ENGLISH)).format(Double.valueOf($F{7}))
于 2021-03-23T20:01:42.623 回答
0

使用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/ 。

于 2021-10-29T19:15:32.273 回答