Formato del negativo de cantidad de dólares con un signo menos, no entre paréntesis (Java)

StackOverflow https://stackoverflow.com/questions/2056400

Pregunta

¿Cómo consigo NumberFormat.getCurrencyInstance() para imprimir los valores negativos de la divisa USD con un signo menos?

¿Fue útil?

Solución 6

Desde que enfrentado a este problema de nuevo, hice algunas investigaciones y encontró una solución más flexible proporcionada por un ICU :

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

Consulte la documentación de la API de NumberFormatter para más detalles.

Otros consejos

Se requiere un poco de ajuste de la DecimalFormat devuelto por NumberFormat.getCurrencyInstance() de hacerlo de una manera independiente de la Localidad. Esto es lo que hice (probado en 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() no puede devolver un valor para todas las configuraciones regionales para todos los sistemas, pero debe trabajar por los más importantes (y yo creo que tiene un retorno razonable sobre su propia, por lo que no debería tener que hacer nada)

Aquí está uno siempre termino usando ya sea en una clase Java oa través de la FMT: Etiqueta formatNumber jstl:

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

Siempre produce al menos un $ 0,00 y es consistente cuando se muestre. También incluye miles separadores donde sea necesario. Puede mover el signo menos delante del signo del dólar si ese es su requisito.

Es probablemente el mejor para crear su propia DecimalFormat si desea un formato específico en lugar de confiar en el valor predeterminado.

Editar:. Se podría probablemente también emitir el resultado de NumberFormat.getCurrencyInstance () para DecimalFormat y ajustarlo a sus preferencias

Probar:

NumberFormat.getCurrencyInstance(Locale.CANADA);

NumberFormat.getCurrencyInstance(Locale.UK);

¿Por qué poi se niega a apoyar la primera opción en el formato de moneda Excel está más allá de mí! introducir descripción de la imagen aquí

No me gusta usar el DecimalFormat para la moneda debido a que su valor final se convierte en una célula no numérico con la introducción del símbolo de moneda. Mientras trabajaba para una importante institución financiera, que tenía la tarea de resolver este problema de formato. La idea central de este cambio es, porque PDI se niega a ser razonables y tienen un amplio soporte de opciones nativas de Excel, que se infiltrará en su código y cambiar sus valores en el núcleo. La siguiente es mi Solución:

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top