J'utilise JSF 2 et RichFaces 3. Ici, dans l'image ci-dessous, les nombres sont affichés tels qu'ils sont dans la base de données.
Mais je veux les afficher comme 6749395.20
si la partie fraction est là et 5095138.00
si aucune fraction n'est présente.
À partir de maintenant, j'ai essayé quelque chose comme ça.
<rich:column>
<f:facet name="header">
<h:outputText value="Total Amount"/>
</f:facet>
<h:outputText value="#{rr[2]}">
<f:convertNumber type="number" groupingUsed="true" minFractionDigits="2" pattern="#0.00"/>
</h:outputText>
</rich:column>
En fait, je les montre tous ensemble, mais j'ai essayé avec tous comme toutes les combinaisons possibles avec type
, groupingUsed
, minFractionDigits
et pattern
.
Pourquoi ça ne marche pas? Comment cela est-il causé et comment puis-je le résoudre?
Cela peut se produire si la valeur n'est pas du tout Number
, par exemple un String
. Vous utilisez alors essentiellement le mauvais type pour les données qu'il représente. Pour représenter des devises en Java, vous devez utiliser BigDecimal
. Assurez-vous également que le type dans la table de base de données est correct, c'est-à-dire qu'il ne doit pas s'agir d'un varchar, mais d'une décimale.
Une fois que vous avez fixé le type de données, le <f:convertNumber>
Fonctionnera comme vous l'avez dit. Notez que l'attribut pattern
remplacera les groupingUsed
et minFractionDigits
. Vous devez utiliser le pattern
ou les autres. De plus, type="number"
Est déjà la valeur par défaut, il peut donc être supprimé.
Donc, soit utiliser
<f:convertNumber pattern="#0.00" />
ou
<f:convertNumber groupingUsed="true" minFractionDigits="2" />
Notez qu'ils génèrent différents formats. Vous souhaiterez probablement définir le regroupement sur false
.
Vous pouvez également utiliser type="currency"
, Il appliquera alors automatiquement le bon modèle selon la UIViewRoot#getLocale()
:
<f:convertNumber type="currency" />
Voir aussi documentation de la bibliothèque de balises et DecimalFormat
javadoc.