webentwicklung-frage-antwort-db.com.de

Negative USD-Werte mit einem Minuszeichen und nicht in Klammern formatieren (Java)

Wie bekomme ich NumberFormat.getCurrencyInstance(), um negative USD-Währungswerte mit einem Minuszeichen zu drucken?

28
Žygimantas

Da ich wieder mit diesem Problem konfrontiert war, habe ich einige Nachforschungen angestellt und eine robustere Lösung gefunden, die ein ICU bietet:

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

Weitere Informationen finden Sie in der API-Dokumentation von NumberFormatter .

0
Žygimantas

Es ist eine kleine Änderung des DecimalFormats erforderlich, das von NumberFormat.getCurrencyInstance() zurückgegeben wird, um dies unabhängig vom Gebietsschema zu tun. Folgendes habe ich gemacht (getestet auf 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() gibt möglicherweise keinen Wert für alle Gebietsschemas für alle Systeme zurück, aber es sollte für die wichtigsten Systeme funktionieren (und ich denke, es hat einen vernünftigen Fallback für sich, also sollten Sie nichts tun müssen)

35
ageektrapped

Hier ist eine, die ich am Ende entweder in einer Java-Klasse oder über das JSTL-Tag fmt: formatNumber benutze:

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

Es produziert immer mindestens 0,00 $ und ist in der Anzeige konsistent. Enthält bei Bedarf auch Tausende Separatoren. Sie können das Minuszeichen vor dem Dollarzeichen verschieben, wenn dies Ihre Anforderung ist.

22
Gennadiy

Versuchen: 

NumberFormat.getCurrencyInstance(Locale.CANADA);

2
E-dou

Es ist wahrscheinlich am besten, Ihr eigenes DecimalFormat zu erstellen, wenn Sie ein bestimmtes Format wünschen, anstatt sich auf das Standard zu verlassen.

Edit: Sie können das Ergebnis von NumberFormat.getCurrencyInstance () möglicherweise auch in DecimalFormat umwandeln und an Ihre Präferenzen anpassen.

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

Warum poi es ablehnt, die FIRST-Option bei der Währungsformatierung in Excel zu unterstützen, liegt mir nicht!  enter image description here

Ich mag es nicht, DecimalFormat für Währungen zu verwenden, da mit der Einführung des Währungssymbols Ihr Endzellenwert nicht numerisch wird. Während ich für ein großes Finanzinstitut arbeitete, wurde ich mit der Lösung dieses Formatierungsproblems beauftragt. Die Kernidee dieser Änderung ist, da POI sich nicht vernünftig verhält und umfassende Unterstützung für die systemeigenen Optionen von Excel bietet, werde ich ihren Code infiltrieren und ihre Werte im Kern ändern. Folgendes ist mein Abhilfe:

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