Pregunta

¿Hay una manera de utilizar DecimalFormat (o algún otro formateador estándar) para formatear números como esto:

  

1000000 => 1,00 M

     

1234567 => 1.23m

     

1234567890 => 1234.57M

dividiendo Básicamente algún número en 1 millón, manteniendo 2 cifras decimales, y golpeando una 'M' en el extremo. He pensado en la creación de una nueva subclase de NumberFormat pero parece más difícil 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 unidad de mapeo de objetos a NumberFormatters. La aplicació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 de dividir por 1 millón, y no puedo usar String.Format () sin envolverlo en un NumberFormatter.

¿Fue útil?

Solución

String.format("%.2fM", theNumber/ 1000000.0);

Para obtener más información, consulte la String.Format javadocs .

Otros consejos

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

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

Aquí hay una subclase de NumberFormat que prepararon rápidamente. Parece que se hace el trabajo, pero no estoy del todo seguro de que es 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...");
    }
};

¿Por qué no simplemente?

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

Tome un vistazo a ChoiseFormat .

Una forma más simple sería utilizar un envoltorio que el auto dividido por 1 m para usted.

Por ahora, se debe utilizar CompactDecimalFormat , que localizar el resultado de formato para locales no ingleses. Otros lugares podrían no utilizar un sufijo "Millones".

Esta funcionalidad será estándar de Java JDK en 12 con CompactNumberFormat.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top