2010-02-20 8 views
23

Mi piacerebbe variare la precisione di una doppia rappresentazione in una stringa che sto formattando in base all'input dell'utente. In questo momento sto cercando qualcosa di simile:Come utilizzare Java String.format con una precisione variabile?

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

tuttavia ricevo un java.util.UnknownFormatConversionException. La mia ispirazione per questo approccio è stata C printf e this resource (sezione 1.3.1).

Ho un semplice errore di sintassi da qualche parte, Java supporta questo caso oppure esiste un approccio migliore?

Edit:

Suppongo che avrei potuto fare qualcosa di simile:

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

ma sarei ancora interessati al supporto nativo per una tale operazione.

risposta

18

Hai risposto alla tua stessa domanda: costruisci la stringa di formato in modo dinamico ... le stringhe di formato valide seguono le convenzioni delineate qui: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Formatter.html#syntax.

Se si desidera un decimale formattato che occupa 8 caratteri totali (compreso il punto decimale) e di voler 4 cifre dopo la virgola, la stringa di formato dovrebbe essere simile "% 8.4f" ...

Per la mia conoscenza non esiste un "supporto nativo" in Java oltre la flessibilità delle stringhe di formato.

2

Perché non:

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

o:

public static String myFormat(String src, int precision, Object args...) 
{ 
    String form = "%."+precision+"f\n"; 
    return String.format(form, args); 
} 
+2

Così vi proponiamo OP qualcosa che conosce già e ha aggiunto nella sua domanda? – Tom

+0

Per lo più suggerisco OP di creare una propria funzione statica che farà ciò che vuole (una funzione nativa del formato stringa che include precisione variabile). Quindi sì e no, perché ha già gli strumenti per farlo. O almeno è quello che sto cercando di fare. – Gerdi

2

È possibile utilizzare 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 

Se si desidera impostare la precisione in fase di esecuzione delle chiamate:

df.setMaximumFractionDigits(precision)