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));
String.format("%.2fM", theNumber/ 1000000.0);
Para obtener más información, vea String.format javadocs .