Pergunta

Como eu consigo NumberFormat.getCurrencyInstance() Para imprimir valores negativos de moeda em USD com um sinal menos?

Foi útil?

Solução 6

Desde que enfrentei esse problema novamente, fiz algumas pesquisas e encontrei uma solução mais resiliente fornecida por um unidade de Terapia Intensiva:

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

Verifique a documentação da API de NumberFormatter para mais detalhes.

Outras dicas

Requer um pouco de ajuste do decimalformato devolvido por NumberFormat.getCurrencyInstance() fazer isso de maneira independente do local. Aqui está o que eu fiz (testado no 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() pode não retornar um valor para todos os locais para todos os sistemas, mas deve funcionar para os principais (e acho que tem um fallback razoável por conta própria, então você não precisa fazer nada)

Aqui está um que eu sempre acabo usando em uma classe Java ou através da tag FMT: formatNumber jstl:

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

Ele sempre produz pelo menos US $ 0,00 e é consistente quando exibido. Também inclui milhares de separadores, quando necessário. Você pode mover o sinal de menos na frente do sinal do dólar, se esse for o seu requisito.

Provavelmente é melhor criar o seu próprio DecimalFormat Se você deseja um formato específico, em vez de confiar no padrão.

Editar: Você provavelmente também poderia lançar o resultado de numberFormat.getCurrencyInstance () para DecimalFormat e ajustá -lo às suas preferências.

Tentar:

NumberFormat.getCurrencyInstance(Locale.CANADA);

NumberFormat.getCurrencyInstance(Locale.UK);

Por que a POI se recusa a apoiar a primeira opção na formatação da moeda do Excel está além de mim! enter image description here

Não gosto de usar o DecimalFormat para moeda, porque o valor da célula final se torna um não numérico com a introdução do símbolo da moeda. Enquanto trabalhava para uma grande instituição financeira, fui encarregado de resolver esse problema de formatação. A idéia principal dessa mudança é que, como o POI se recusa a ser razoável e ter suporte abrangente das opções nativas do Excel, infiltrarei seu código e alterarei seus valores no núcleo. A seguir, a minha solução alternativa:

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!!!");
        }
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top