Java: Format de nombre en millions
-
22-08-2019 - |
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.
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
.