Question

Y at-il un moyen d'utiliser DecimalFormat (ou un autre formatter standard) aux numéros de format comme ceci:

  

1000000 => 1,00 M

     

1234567 => 1,23 M

     

1234567890 => 1234.57M

En gros divisant un nombre de 1 million, en gardant 2 décimales, et gifler un « M » à la fin. J'ai pensé à créer une nouvelle sous-classe de NumberFormat, mais il semble plus délicat que je ne l'imaginais.

J'écris une API qui a une méthode de format qui ressemble à ceci:

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

En interne, je suis cartographie des objets de l'unité à NumberFormatters. La mise en œuvre est quelque chose comme ceci:

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

Notez que pour cette raison, je ne peux pas attendre le client de diviser par 1 million, et je ne peux pas utiliser String.format () sans l'emballer dans un NumberFormatter.

Était-ce utile?

La solution

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

Pour plus d'informations, consultez la page String.format javadocs .

Autres conseils

Notez que si vous avez un BigDecimal, vous pouvez utiliser la méthode movePointLeft:

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

Voici une sous-classe de NumberFormat que je fouetté. On dirait qu'il fait le travail, mais je ne suis pas tout à fait sûr que c'est la meilleure façon:

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...");
    }
};

Pourquoi ne pas tout simplement?

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

Jetez un oeil à ChoiseFormat .

Une façon plus simple serait d'utiliser une enveloppe qui auto divisé par 1 m pour vous.

Pour l'instant, vous devez utiliser le CompactDecimalFormat , qui localisera le résultat de la mise en forme pour les environnements locaux non anglais. D'autres endroits pourraient ne pas utiliser un suffixe « Millions ».

Cette fonctionnalité sera standard Java JDK 12 avec CompactNumberFormat.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top