formatting a string to a currency format in jasper

2019-01-04 13:06发布

I have a string with some numeric value.

I want to format it in a way where hundreds are comma separated and the number is having $ dollar sign before it.

e.g. 12345 should be formatted to $ 12,345.00

I tried the below code without dollar sign:

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

and the below one with dollar sign:

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

However, both are giving error.

What is the right way to achieve this format ?

This is a part of jasper report jrxml where I want to avoid "null" on the report and thus inserting the below code:

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

Where myString results from a query and is declared in jrxml as:

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

Earlier myString was declared as BigDecimal, but then comparison operator ?= was not working.

If the currency value is not available, I want to print "unavailable" on the report instead of default "null". Else, I want the number to be properly formatted as described above.

How to resolve this issue?

Thanks for reading.

6条回答
做个烂人
2楼-- · 2019-01-04 13:32

You can do this also using the iReport Studio. In the studio click on the field and see the properties pane.In properties pane under Text Field Properties you'll find the Pattern property. Paste #,##0.00 or click on the three dots and tick the check box in the popup menu to separate at 1000.

查看更多
Anthone
3楼-- · 2019-01-04 13:36

The correct expression is:

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

The working sample for java.lang.Integer and 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>

The result will be (preview in iReport):

The result in *iReport*

Note: You should also add check for null.

You can also use pattern property of textField for formatting data.

The sample:

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

The result will be the same.

查看更多
等我变得足够好
4楼-- · 2019-01-04 13:38

Just came accross this Problem and found a solution which is working fine for me.

Be Aware - its not exactly what the Autor is asking for but if you google this Problem you will end up here.

I have Servers with German and English Locale and on all the Currency should be like 7.500,60

My final expression:

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

so the Locale Setting is "hardcoded" - exactly what i needed.

Maybe this will help someone

查看更多
我想做一个坏孩纸
5楼-- · 2019-01-04 13:51

Im using iReport 5.6.0 and I took some of these answers but what It worked for me was:

Text Field (I put this into the designer):

Float.valueOf($V{DISPONIBLE_FINAL})

And in the Pattern (into properties tab), I used Custom Format with:

$#,##0.00

Putting all the string mentioned here in a whole "Edit expression" field didnt worked for me.

Hope It helps.

PD: I was using groovy jar that is the compatible with jasper 5.6.0 checked in mvnrepository site.

查看更多
爱情/是我丢掉的垃圾
6楼-- · 2019-01-04 13:54

The above code can work for three cases:

  1. fix two zeros after decimal point. When I tried to use "Double" datatype for this purpose it did not work for me. But this code can do it.
  2. Fix $ -sign before the number in string datatype and also takes care of "-" sign in its own.
  3. Get "," after 3 digits in a number

For me i wanted to put "," comma after every three digits (by passing string as a parameter) and i tried the following code. It did work for me.... Thank you very much. I appreciate this answer.

<textFieldExpression>

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

</textFieldExpression>
查看更多
爱情/是我丢掉的垃圾
7楼-- · 2019-01-04 13:55

When trying the recommended answer in iReport, I got "illegal string body character after dollar sign;" when I ran the report.

Easily remedied by escaping the dollar sign with a backslash like so:

new java.text.DecimalFormat("\$ #,##0.00").format(Double.valueOf($F{le1_feeAmount}))
查看更多
登录 后发表回答