Frage

Wie erhalte ich NumberFormat.getCurrencyInstance() negative USD Währungswerte mit einem Minuszeichen drucken?

War es hilfreich?

Lösung 6

Da ich dieses Problem wieder konfrontiert, habe ich einige der Forschung und fand eine elastischere Lösung durch einen bereitgestellt ICU

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

Überprüfen Sie die API-Dokumentation von NumberFormatter für weitere Details.

Andere Tipps

Es erfordert ein wenig Gefummel der DecimalFormat von NumberFormat.getCurrencyInstance() kehrte er in einer locale-unabhängige Weise zu tun. Hier ist, was ich habe (auf Android getestet):

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() kann keinen Wert für alle Schauplätze für alle Systeme zurückkehren, aber es sollte für die wichtigsten diejenigen arbeiten (und ich denke, es ist eine vernünftige Rückfall auf seine eigene hat, so sollte man nichts zu tun haben)

Hier ist ein ich immer in einer Java-Klasse entweder am Ende oder über das fmt: format jstl Tag:

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

Es produziert immer mindestens ein $ 0,00 und konsistent ist, wenn angezeigt. Tausende seperators beinhaltet auch, wo nötig. Sie können auf das Minuszeichen vor dem Dollarzeichen bewegen, wenn die Ihre Anforderung ist.

Versuchen Sie:

NumberFormat.getCurrencyInstance(Locale.CANADA);

NumberFormat.getCurrencyInstance(Locale.UK);

Warum poi WEIGERT die erste Option in Excel-Währung zu stützen Formatierung ist mir! eingeben Bild Beschreibung hier

Ich weiß nicht, wie die DecimalFormat für Währung verwenden, weil Ihr Endzelle Wert ein nicht-numerische mit der Einführung des Währungssymbols wird. Während für ein großes Finanzinstitut arbeitet, wurde ich mit der Lösung dieses Problems Formatierung beauftragt. Der Kerngedanke dieser Änderung ist, weil POI, vernünftig zu sein verweigert und hat eine umfassende Unterstützung von Excel nativen Optionen, werde ich ihren Code infiltrieren und ihre Werte im Kern verändern. Das Folgende ist meine 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!!!");
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top