2012-03-22 21 views
14

Quiero tener un parámetro en una cadena en strings.xml y este parámetro debe ser un valor doble. Entonces uso %1$f. Aquí - http://developer.android.com/reference/java/util/Formatter.html hay muchos ejemplos, pero ¿qué ocurre si quiero tener unos pocos parámetros double/float y solo quiero que el segundo tenga 2 dígitos después de .? Traté de usar combinaciones como %2$.2f o %2.2$f. Ni de ellos funcionó. %.1f no funciona tan bien. Entonces, ¿alguien sabe cómo puedo "personalizar" un valor float/double dentro de un strings.xml? Gracias.Parámetro doble con 2 dígitos después del punto en strings.xml?

Respuesta

-5

Si se tratara de mí me gustaría almacenar los valores de los recursos como valores simples, y luego usar métodos formateador para controlar la forma en que se muestran, más o menos así

public String formatFigureTwoPlaces(float value) { 
    DecimalFormat myFormatter = new DecimalFormat("##0.00"); 
    return myFormatter.format(value); 
} 

public String formatFigureOnePlace(float value) { 
    DecimalFormat myFormatter = new DecimalFormat("##0.0"); 
    return myFormatter.format(value); 
} 
+26

Gracias, amigo, pero debo supervisado ... '% 1 $ .2f' funciona tan bien. – lomza

+2

¡El comentario aquí es la respuesta real! Deberías ponerlo como otra respuesta a esta pregunta. Casi no lo vi – accordionfolder

+0

la respuesta de Iomza en los comentarios es la solución real – Kachi

-2

ahora que esta respuesta es que llega demasiado tarde ... pero espero poder ayudar a otras personas:

Android chupa con múltiples parámetros sustituciones cuando se desea que los números decimales y formatear esta en un estilo común% a.bf

La mejor solución que han encontrado (y solo para este tipo de recursos) ES) es poner los parámetros decimales como cadenas% n $ s y en el Código se aplican con mi conversión String.Format (...)



Ejemplo:


INCORRECTA:

// en el archivo XML:

<string name="resource1">You has a desviation of %1$s and that is a %2$.2f%% percentage.</string> 

// Y en el archivo java

String sresult = getString(R.string.resource1, svalue, spercentage); // <-- exception! 

Esta solución es técnicamente correcto, pero incorrecta debido a un sistema de recursos de sustitución de Android por lo la última línea generará una excepción.



CORRECTA/SOLUCIÓN:

simplemente convertir el segundo parámetro en una cadena.

<string name="resource1">You has a desviation of %1$s and that is a %2$s percentage.</string> 

Y ahora en el código:

... 

    // This is the auxiliar line added to solve the problem 
    String spercentage = String.format("%.2f%%",percentage); 

    // This is the common code where we use the last variable. 
    String sresult = getString(R.string.resource1, svalue, spercentage); 
+0

¿Cuál es el tipo de 'spercentage' en su ejemplo" incorrecto "? Supongo (como indica @Nik Reiman) que es un 'String', es decir, no es de extrañar que obtengas una excepción cuando tratas de pasarlo como float (en'% 2 $ .2f'). Esta "respuesta" es incompleta y engañosa. – BadCash

+0

También no puedo obtener flotantes formateados para que funcionen desde un recurso de cadena, y sí, estoy pasando un flotador. Utilizo "% 1 $ 0.6f" en el recurso de cadena, y recibo una excepción: java.util.MissingFormatWidthException:% 01 $ .6f, por lo que se está mutilando de alguna manera. Esta respuesta es correcta. – Aaron

64

Simplemente añadiendo a la respuesta de @ David Airam aquí; la solución "incorrecta" que da es en realidad correcta, pero con un poco de ajuste.El archivo XML debe contener:

<string name="resource1">Hello string: %1$s, and hello float: %2$.2f.</string> 

Ahora en el código Java:

String svalue = "test"; 
float sfloat= 3.1415926; 
String sresult = getString(R.string.resource1, svalue, sfloat); 

la excepción de que @ David Airam informó es de tratar de atascar un String en un especificador de formato con %f, que requiere una tipo de punto flotante Use float y no hay tal excepción.

Además, puede usar Float.valueOf() para convertir una Cadena en un flotador en caso de que sus datos de entrada fueran originalmente una cadena (por ejemplo, de un EditText o algo así). Sin embargo, debe siempre probar/atrapar valueOf() operaciones y manejar el caso NumberFormatException, ya que esta excepción está desmarcada.

+0

¡Gracias! Ahorré mi tiempo –

0

% .1f trabajo para mí si usted gusta mostrar sólo un 1 dígito después ''

Cuestiones relacionadas