Domanda

Come faccio ad avere NumberFormat.getCurrencyInstance() stampare valori di dollari di valuta negativi con un segno meno?

È stato utile?

Soluzione 6

Da quando ho affrontato ancora una volta questo problema, ho fatto qualche ricerca e ho trovato una soluzione più elastica fornita da un ICU :

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

Controlla documentazione delle API di NumberFormatter per maggiori dettagli.

Altri suggerimenti

Si richiede un piccolo ritocco del DecimalFormat restituito da NumberFormat.getCurrencyInstance() di farlo in un modo locale-indipendente. Ecco quello che ho fatto (testato su 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() non può restituire un valore per tutte le impostazioni per tutti i sistemi, ma dovrebbe funzionare per i più grandi (e penso che abbia una ragionevole fallback da solo, quindi non dovreste avere a che fare nulla)

Ecco uno finisco sempre utilizzando sia in una classe Java o tramite il fmt: tag formatNumber JSTL:

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

Si produce sempre almeno $ 0,00 e sia coerente quando sono visualizzate. Inoltre include migliaia separatori dove necessario. È possibile spostare il segno meno davanti al simbolo del dollaro se questo è il vostro requisito.

E 'probabilmente meglio per tenere la tua DecimalFormat se si desidera un formato specifico piuttosto che basarsi su quella predefinita.

Modifica:. Si potrebbe forse anche il cast del risultato di NumberFormat.getCurrencyInstance () per DecimalFormat e adattarlo alle proprie preferenze

Prova:

NumberFormat.getCurrencyInstance(Locale.CANADA);

NumberFormat.getCurrencyInstance(Locale.UK);

Perché poi si rifiuta di sostenere la prima opzione nella formattazione valuta Excel è oltre me! entrare descrizione dell'immagine qui

Non mi piace usare la DecimalFormat per la valuta perché il valore di una cella end diventa un non numerico con l'introduzione del simbolo di valuta. Mentre si lavora per un importante istituto finanziario, che è stato incaricato di risolvere il problema di formattazione. L'idea centrale di questo cambiamento è, perché POI si rifiuta di essere ragionevoli e hanno un supporto completo di opzioni native di Excel, io infiltrato il loro codice e modificarne i valori al centro. Quanto segue è la mia SOLUZIONE:

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!!!");
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top