web-dev-qa-db-fra.com

Formater le montant négatif en USD avec un signe moins, pas entre crochets (Java)

Comment faire pour que NumberFormat.getCurrencyInstance() imprime les valeurs négatives de la devise USD avec un signe moins?

28
Žygimantas

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.

0
Žygimantas

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)

35
ageektrapped

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.

22
Gennadiy

Essayer: 

NumberFormat.getCurrencyInstance(Locale.CANADA);

2
E-dou

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.

2
Michael Borgwardt
NumberFormat.getCurrencyInstance(Locale.UK);
0
Pnemonic

Pourquoi poi REFUSE-t-il de prendre en charge l'option FIRST dans Excel? Le formatage monétaire me dépasse!  enter image description here

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!!!");
        }
    }
}
0
rheaghen