2010-02-20 18 views
23

Je voudrais faire varier la précision d'une représentation double dans une chaîne que je suis en train de formater en fonction de l'entrée de l'utilisateur. En ce moment je suis en train quelque chose comme:Comment Java String.format avec une précision variable?

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

mais je reçois un java.util.UnknownFormatConversionException. Mon inspiration pour cette approche était C printf et this resource (section 1.3.1).

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

Edit:

Je suppose que je pouvais faire quelque chose comme:

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

mais je serais encore intéressé par un support natif pour une telle opération.

Répondre

18

Vous avez en quelque sorte répondu à votre propre question - créez votre chaîne de format de manière dynamique ... les chaînes de formatage valables 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 au format qui occupe 8 caractères au total (y compris le point décimal) et que vous vouliez 4 chiffres après la virgule, votre chaîne de format devrait ressembler à « % 8.4f » ...

Pour D'après mes connaissances, il n'y a pas de "support natif" en Java au-delà des chaînes de format flexibles.

2

Pourquoi ne 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

donc vous suggérer quelque chose OP qu'il connaît déjà et ajouté à sa question? – Tom

+0

Je suggère surtout OP pour faire sa propre fonction statique qui fera ce qu'il veut (une fonction native de format de chaîne qui inclut une précision variable). Alors oui et non, car il a déjà les outils pour le faire. Ou du moins c'est ce que j'essaie de faire. – Gerdi

2

Vous pouvez utiliser la classe DecimalFormat.

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 à l'appel de l'exécution:

df.setMaximumFractionDigits(precision)