it-swarm.com.de

formatieren einer Zeichenfolge in einem Währungsformat in Jasper-Bericht

Ich habe eine Zeichenfolge mit einem numerischen Wert. 

Ich möchte es so formatieren, dass Hunderte durch Kommas getrennt sind und die Zahl ein $ -Zollzeichen enthält. 

z.B. 12345 sollte zu $ ​​12.345.00 formatiert werden

Ich habe den folgenden Code ohne Dollarzeichen ausprobiert:

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

und die unten mit Dollarzeichen:

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

Beide geben jedoch Fehler. 

Was ist der richtige Weg, um dieses Format zu erreichen?

Dies ist ein Teil von Jasper Report jrxml, in dem ich "null" für den Bericht vermeiden möchte und daher den folgenden Code einfügen:

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

Wo myString aus einer Abfrage resultiert und in jrxml wie folgt deklariert ist:

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

MyString wurde früher als BigDecimal deklariert, der Vergleichsoperator = = funktionierte jedoch nicht. 

Wenn der Währungswert nicht verfügbar ist, möchte ich den Bericht "nicht verfügbar" anstelle des Standardwerts "null" drucken. Andernfalls möchte ich, dass die Nummer wie oben beschrieben korrekt formatiert ist.

Wie kann dieses Problem gelöst werden?

Danke fürs Lesen. 

14
Vicky

Der korrekte Ausdruck lautet:

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

Das Arbeitsbeispiel fürJava.lang.IntegerundJava.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>

Das Ergebnis wird (Vorschau in iReport) sein:

The result in *iReport*

Hinweis: Sie sollten auch eine Überprüfung auf Null hinzufügen.

Sie können auchpatternproperty von textField zum Formatieren von Daten verwenden.

Die Probe:

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

Das Ergebnis wird das gleiche sein.

31
Alex K

Der obige Code kann in drei Fällen funktionieren:

  1. nach dem Komma zwei Nullen setzen. Als ich versuchte, den Datentyp "Double" für diesen Zweck zu verwenden, funktionierte er nicht für mich. Aber dieser Code kann es schaffen.
  2. Fixiere $ -sign vor der Zahl im String-Datentyp und kümmert sich auch um das "-" - Zeichen.
  3. Holen Sie sich "," nach 3 Ziffern in einer Zahl

Für mich wollte ich "," nach jeweils drei Ziffern setzen (durch Übergabe von String als Parameter) und habe den folgenden Code versucht. Es hat für mich funktioniert ... Vielen Dank. Ich freue mich über diese Antwort. 

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

Ich kam gerade durch dieses Problem und fand eine Lösung, die für mich gut funktioniert.

Seien Sie sich bewusst - es ist nicht genau das, was die Autorin verlangt, aber wenn Sie dieses Problem googeln, landen Sie hier.

Ich habe Server mit deutschem und englischem Gebietsschema und auf allen Währungen sollte 7.500,60 stehen. 

Mein letzter Ausdruck:

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

die Ländereinstellung ist also "hartcodiert" - genau das, was ich brauchte.

Vielleicht hilft das jemandem

1
Frankstar

Sie können dies auch mit iReport Studio tun .. Im Studio klicken Sie auf das Feld und sehen den Eigenschaftenbereich. Im Eigenschaftenbereich unter Text Field Properties finden Sie die Eigenschaft Pattern. Fügen Sie #, ## 0.00 ein, oder klicken Sie auf die drei Punkte, und aktivieren Sie das Kontrollkästchen im Popup-Menü, um sich bei 1000 zu trennen.

0

Als ich die empfohlene Antwort in iReport ausprobierte, bekam ich "illegalen String-Body-Zeichen nach Dollar-Zeichen". als ich den Bericht lief.

Leicht zu beheben, indem Sie dem Dollarzeichen mit einem umgekehrten Schrägstrich wie folgt entkommen:

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

Ich verwende iReport 5.6.0 und ich nahm einige dieser Antworten, aber es hat für mich funktioniert:

Textfeld (ich füge das in den Designer ein): 

Float.valueOf($V{DISPONIBLE_FINAL})

Und in der Registerkarte Muster (in den Eigenschaften) habe ich das benutzerdefinierte Format verwendet mit:

$#,##0.00

Alle hier genannten Zeichenketten in ein gesamtes Feld "Ausdruck bearbeiten" zu setzen, hat bei mir nicht funktioniert.

Ich hoffe es hilft. 

PD: Ich habe grooviges Glas verwendet, das mit jasper 5.6.0 in mvnrepository-Site eingecheckt ist.

0
Rodol Velasco