Comment Java chaîne.format avec une précision variable?

Je voudrais varier la précision d'une double représentation dans une chaîne que je suis en train de formater en fonction de l'entrée de l'utilisateur. En ce moment, j'essaie quelque chose comme:

String foo = String.format("%.*fn", precision, my_double);

Cependant, je reçois un java.util.UnknownFormatConversionException. Mon inspiration pour cette approche était c printf et cette ressource (section 1.3.1).

Ai-je une erreur de syntaxe simple quelque part, Java supporte-t-il ce cas, ou y a-t-il une meilleure approche?

Modifier:

Je suppose que je pourrais faire quelque chose comme:

String foo = String.format("%." + precision + "fn", my_double);

Mais je serais toujours intéressé par le support natif pour une telle opération.

23
demandé sur Willi Mentzel 2010-02-20 07:26:12

3 réponses

Vous avez en quelque sorte répondu à votre propre question - construisez votre chaîne de format dynamiquement... les chaînes de format valides suivent les conventions décrites ici: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Formatter.html#syntax .

Si vous voulez une décimale formatée qui occupe 8 caractères au total (y compris le point décimal) et que vous vouliez 4 chiffres après le point décimal, votre chaîne de format devrait ressembler à "%8.4 f"...

À ma connaissance, il n'y a pas de "support natif" en Java au-delà des chaînes de format étant flexibles.

18
répondu vicatcu 2010-02-20 04:39:39

Vous pouvez utiliser la classeDecimalFormat .

double d1 = 3.14159;
double d2 = 1.235;

DecimalFormat df = new DecimalFormat("#.##");

double roundedD1 = df.format(d); // 3.14
double roundedD2 = df.format(d); // 1.24

Si vous souhaitez définir la précision au moment de l'exécution appel:

df.setMaximumFractionDigits(precision)
3
répondu Willi Mentzel 2016-06-30 11:55:53

Pourquoi pas :

String form = "%."+precision+"f\n";
String foo = String.format(form, my_double);

Ou :

public static String myFormat(String src, int precision, Object args...)
{
    String form = "%."+precision+"f\n";
    return String.format(form, args);
}
2
répondu Gerdi 2016-07-14 13:19:31