2010-02-20 24 views
23

Me gustaría variar la precisión de una representación doble en una cadena que estoy formateando según la entrada del usuario. En este momento estoy tratando algo como:¿Cómo Java String.format con una precisión variable?

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

sin embargo he recibido un java.util.UnknownFormatConversionException. Mi inspiración para este enfoque fue C printf y this resource (sección 1.3.1).

¿Tengo un error de sintaxis simple en alguna parte, Java soporta este caso, o hay un mejor enfoque?

Editar:

supongo que podría hacer algo como:

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

pero todavía estaría interesado en el soporte nativo para tal operación.

Respuesta

18

Responde de manera parecida a tu propia pregunta: crea tu cadena de formato de forma dinámica ... las cadenas de formato válidas siguen las convenciones que se resumen aquí: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Formatter.html#syntax.

Si desea un formato decimal que ocupa 8 caracteres en total (incluyendo el punto decimal) y que quería 4 dígitos después del punto decimal, su cadena de formato debe ser similar a "% 8.4f" ...

Para Según mis conocimientos, no hay "soporte nativo" en Java más allá de que las cadenas de formato sean flexibles.

2

Por qué no:

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

Así que sugieren OP algo que ya conoce y ha añadido en su pregunta? – Tom

+0

Estoy principalmente sugiriendo OP para hacer su propia función estática que hará lo que quiera (una función nativa de formato de cadena que incluye precisión variable). Así que sí y no, porque él ya tiene las herramientas para hacerlo. O al menos eso es lo que intento hacer. – Gerdi

2

Usted puede utilizar la clase 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 desea establecer la precisión durante la ejecución tiempo de atención:

df.setMaximumFractionDigits(precision) 
Cuestiones relacionadas