truncar separar por numeros numero numberformat moneda miles formato decimales java formatting numeric numericupdown

numeros - separar por miles java



Java: nĂºmero de formato en millones (5)

¿Hay alguna manera de usar DecimalFormat (o algún otro formateador estándar) para formatear números como este?

1,000,000 => 1,00 M

1,234,567 => 1,23 M

1,234,567,890 => 1234.57M

Básicamente dividiendo algunos números por 1 millón, manteniendo 2 decimales, y abofeteando una ''M'' en el extremo. He pensado en crear una nueva subclase de NumberFormat pero parece más complicada de lo que imaginaba.

Estoy escribiendo una API que tiene un método de formato que se ve así:

public String format(double value, Unit unit); // Unit is an enum

Internamente, estoy mapeando objetos de la Unidad a NumberFormatters. La implementación es algo como esto:

public String format(double value, Unit unit) { NumberFormatter formatter = formatters.get(unit); return formatter.format(value); }

Tenga en cuenta que debido a esto, no puedo esperar que el cliente se divida por 1 millón, y no puedo simplemente usar String.format () sin envolverlo en NumberFormatter.


¿Por qué no simplemente?

DecimalFormat df = new DecimalFormat("0.00M"); System.out.println(df.format(n / 1000000));


Aquí hay una subclase de NumberFormat que elevé. Parece que hace el trabajo, pero no estoy del todo seguro de que sea la mejor manera:

private static final NumberFormat MILLIONS = new NumberFormat() { private NumberFormat LOCAL_REAL = new DecimalFormat("#,##0.00M"); public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) { double millions = number / 1000000D; if(millions > 0.1) LOCAL_REAL.format(millions, toAppendTo, pos); return toAppendTo; } public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) { return format((double) number, toAppendTo, pos); } public Number parse(String source, ParsePosition parsePosition) { throw new UnsupportedOperationException("Not implemented..."); } };


Eche un vistazo a ChoiseFormat .

Una forma más simple sería usar un contenedor dividido automáticamente por 1 m.


Tenga en cuenta que si tiene un BigDecimal , puede usar el método movePointLeft :

new DecimalFormat("#.00").format(value.movePointLeft(6));