Comment faire pour que NumberFormat.getCurrencyInstance()
imprime les valeurs négatives de la devise USD avec un signe moins?
Depuis que j'ai rencontré ce problème à nouveau, j'ai fait quelques recherches et trouvé une solution plus résiliente fournie par un ICU :
NumberFormatter
.withLocale(...)
.unit(Currency.getInstance("USD"))
.sign(SignDisplay.AUTO) // "123", "0", and "-123"
.format(123)
.toString();
Consultez la documentation API de NumberFormatter pour plus de détails.
Cela nécessite un petit ajustement du DecimalFormat renvoyé par NumberFormat.getCurrencyInstance()
pour le faire d'une manière indépendante de la localisation. Voici ce que j'ai fait (testé sur Android):
DecimalFormat formatter = (DecimalFormat)NumberFormat.getCurrencyInstance();
String symbol = formatter.getCurrency().getSymbol();
formatter.setNegativePrefix(symbol+"-"); // or "-"+symbol if that's what you need
formatter.setNegativeSuffix("");
IIRC, Currency.getSymbol()
peut ne pas renvoyer une valeur pour tous les paramètres régionaux pour tous les systèmes, mais cela devrait fonctionner pour les principaux (et je pense qu'il a un repli raisonnable, donc vous ne devriez rien faire)
En voici un que je finis toujours par utiliser soit dans une classe Java, soit via la balise fmt: formatNumber jstl:
DecimalFormat format = new DecimalFormat("$#,##0.00;$-#,##0.00");
String formatted = format.format(15.5);
Il produit toujours au moins 0,00 $ et est cohérent lorsqu'il est affiché. Comprend également des milliers de séparateurs si nécessaire. Vous pouvez déplacer le signe moins devant le signe dollar si tel est votre souhait.
Essayer:
NumberFormat.getCurrencyInstance(Locale.CANADA);
Il est probablement préférable de créer votre propre DecimalFormat
si vous voulez un format spécifique plutôt que de vous fier au format par défaut.
Edit: Vous pouvez probablement aussi convertir le résultat de NumberFormat.getCurrencyInstance () en DecimalFormat
et l’adapter à vos préférences.
NumberFormat.getCurrencyInstance(Locale.UK);
Pourquoi poi REFUSE-t-il de prendre en charge l'option FIRST dans Excel? Le formatage monétaire me dépasse!
Je n'aime pas utiliser DecimalFormat pour la devise, car la valeur de votre cellule de fin devient non numérique avec l'introduction du symbole monétaire. Alors que je travaillais pour une grande institution financière, j’ai été chargé de résoudre ce problème de formatage. L’idée centrale de ce changement est que, parce que POI refuse d’être raisonnable et bénéficie d’une prise en charge complète des options natives d’Excel, je vais infiltrer leur code et modifier leurs valeurs. Ce qui suit est mon contournement:
private static final String CURRENCY_FORMAT_OVERRIDE = "\"$\"#,##0.00_);-\"$\"#,##0.00";
private static final String CURRENCY_FORMAT_TARGET = "\"$\"#,##0.00_);(\"$\"#,##0.00)";
static { // static class level initializer
Field field = org.Apache.poi.ss.usermodel.BuiltinFormats.class.getDeclaredField("_formats");
field.setAccessible(true);
String[] _formats = (String[])field.get(new org.Apache.poi.ss.usermodel.BuiltinFormats());
for(int i = 0; i < _formats.length; ++i) {
if(_formats[i].equals(CURRENCY_FORMAT_TARGET)) {
_formats[i]=CURRENCY_FORMAT_OVERRIDE;
System.out.println("TAKE THAT, POI!!!");
}
}
}