web-dev-qa-db-fra.com

formater une chaîne en un format monétaire dans un rapport jasper

J'ai une chaîne avec une valeur numérique. 

Je veux le formater de manière à ce que des centaines soient séparées par des virgules et que le nombre soit précédé du signe dollar. 

par exemple. 12345 devrait être formaté à 12 345,00 $

J'ai essayé le code ci-dessous sans signe dollar:

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

et celui en dessous avec le signe dollar:

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

Cependant, les deux donnent une erreur. 

Quelle est la bonne façon de réaliser ce format?

Ceci est une partie de jasper report jrxml où je veux éviter "null" sur le rapport et insérer ainsi le code ci-dessous:

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

Où myString résulte d'une requête et est déclaré en jrxml comme suit:

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

Auparavant, myString était déclaré en tant que BigDecimal, mais l'opérateur de comparaison? = Ne fonctionnait pas. 

Si la valeur monétaire n'est pas disponible, je souhaite imprimer "non disponible" sur le rapport au lieu de "null" par défaut. Sinon, je veux que le numéro soit correctement formaté comme décrit ci-dessus.

Comment résoudre ce problème?

Merci d'avoir lu. 

14
Vicky

La bonne expression est:

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

L'échantillon de travail pourJava.lang.IntegeretJava.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>

Le résultat sera (aperçu dans iReport):

The result in *iReport*

Remarque: Vous devez également ajouter une vérification de null.

Vous pouvez également utiliserpatternpropriété de textField pour formater les données.

L'échantillon:

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

Le résultat sera le même.

31
Alex K

Le code ci-dessus peut fonctionner dans trois cas:

  1. fixe deux zéros après le point décimal. Lorsque j'ai essayé d'utiliser le type de données "Double" à cette fin, cela n'a pas fonctionné pour moi. Mais ce code peut le faire.
  2. Fixe $ -sign avant le nombre dans le type de données string et prend également en charge le signe "-" lui-même.
  3. Obtenez "," après 3 chiffres dans un numéro

Pour moi, je voulais mettre "," virgule tous les trois chiffres (en passant chaîne en tant que paramètre) et j'ai essayé le code suivant. Cela a fonctionné pour moi ... Merci beaucoup. J'apprécie cette réponse. 

<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

Je viens de découvrir ce problème et de trouver une solution qui fonctionne bien pour moi.

Soyez conscient - ce n'est pas exactement ce que demande l'auteur, mais si vous google ce problème, vous vous retrouverez ici.

J'ai des serveurs avec les paramètres régionaux allemand et anglais et sur toute la devise devrait être comme 7.500,60 

Ma dernière expression:

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

le paramètre Locale est donc "codé en dur" - exactement ce dont j'avais besoin.

Peut-être que cela aidera quelqu'un

1
Frankstar

Vous pouvez le faire également à l’aide de iReport Studio . Dans le studio, cliquez sur le champ et consultez le volet de propriétés. Dans le volet de propriétés, sous Propriétés du champ de texte, vous trouverez la propriété Pattern. Collez #, ## 0.00 ou cliquez sur les trois points et cochez la case dans le menu contextuel pour les séparer à 1000.

0
Gayan Kavirathne

En essayant la réponse recommandée dans iReport, j'ai eu "caractère de corps de chaîne illégal après le signe dollar;" quand j'ai couru le rapport.

Il est facile d'y remédier en échappant au signe dollar avec une barre oblique inverse, comme suit:

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

J'utilise iReport 5.6.0 et j'ai pris certaines de ces réponses mais cela a fonctionné pour moi était:

Champ de texte (je l'ai mis dans le concepteur): 

Float.valueOf($V{DISPONIBLE_FINAL})

Et dans l'onglet Motif (dans l'onglet Propriétés), j'ai utilisé Format personnalisé avec:

$#,##0.00

Mettre toute la chaîne mentionnée ici dans tout un champ "Editer l'expression" ne fonctionnait pas pour moi.

J'espère que ça aide. 

PD: J'utilisais groovy jar compatible avec jasper 5.6.0 vérifié sur le site de stockage.

0
Rodol Velasco