Question

Comment puis-je obtenir NumberFormat.getCurrencyInstance() d'imprimer des valeurs négatives de change USD avec un signe moins?

Était-ce utile?

La solution 6

Depuis que je fait face à ce problème encore une fois, je l'ai fait quelques recherches et trouvé une solution plus souple fournie par un soins intensifs :

NumberFormatter
  .withLocale(...)
  .unit(Currency.getInstance("USD"))
  .sign(SignDisplay.AUTO) // "123", "0", and "-123"
  .format(123)
  .toString();

Consultez la documentation de l'API de NumberFormatter pour plus de détails.

Autres conseils

Il faut un peu de peaufinage du DecimalFormat retourné par NumberFormat.getCurrencyInstance() de le faire d'une manière locale indépendante. Voici ce que je ne (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 retourner une valeur pour tous les paramètres régionaux pour tous les systèmes, mais il devrait fonctionner pour les grands (et je pense qu'il a une solution de repli raisonnable lui-même, de sorte que vous ne devriez pas avoir à faire quoi que ce soit)

Voici que je finis toujours en utilisant soit dans une classe java ou via le FMT: formatNumber tag jstl:

DecimalFormat format = new DecimalFormat("$#,##0.00;$-#,##0.00");
String formatted = format.format(15.5);

Elle produit toujours au moins un 0,00 $ et est conforme à l'affichage. Elle comprend également des milliers seperators en cas de besoin. Vous pouvez déplacer le signe moins devant le signe dollar si tel est votre exigence.

Il est préférable de créer votre propre probablement DecimalFormat si vous voulez un format spécifique plutôt que de compter sur la valeur par défaut.

Edit:. Vous pouvez probablement jeter le résultat de NumberFormat.getCurrencyInstance () pour DecimalFormat et l'adapter à vos préférences

Essayez:

NumberFormat.getCurrencyInstance(Locale.CANADA);

NumberFormat.getCurrencyInstance(Locale.UK);

Pourquoi poi REFUSE pour soutenir la première option dans Excel mise en forme de la monnaie est au-delà de moi! entrer la description d'image ici

Je n'aime pas utiliser la DecimalFormat pour la devise parce que votre valeur de la cellule de fin devient un non-numérique avec l'introduction du symbole monétaire. Tout en travaillant pour une institution financière, j'ai été chargé de résoudre ce problème de formatage. L'idée de base de ce changement est, parce que POI refuse d'être raisonnable et avoir le soutien complet des options natives d'Excel, j'infiltre leur code et changer leurs valeurs au cœur. Ce qui suit est mon DEPANNAGE:

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!!!");
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top