declaración de formato en un archivo de recursos de cadena

147

Tengo cadenas definidas en el archivo de recursos strings.xml habitual como este:

<string name="hello_world"> HELLO</string>

¿Es posible definir cadenas de formato como la siguiente?

 result_str = String.format("Amount: %.2f  for %d days ",  var1, var2);

en el archivo de recursos strings.xml?

Traté de escapar de los caracteres especiales pero no funciona.

CocoNess
fuente
1
Puede probar de la siguiente manera: mTextView.setText (String.format ("Puntuación:" + "% 1 $ s", se ejecuta)); donde int corre = 100;
Ganesh

Respuestas:

264

No necesita usar formatted="false"en su XML. Solo necesita usar marcadores de formato de cadena completamente calificados %[POSITION]$[TYPE](donde [POSITION]está la posición del atributo y [TYPE]el tipo de variable), en lugar de las versiones cortas, por ejemplo %so %d.

Cita de Documentos de Android: Formato y estilo de cadena :

<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>

En este ejemplo, la cadena de formato tiene dos argumentos: %1$ses una cadena y %2$des un entero decimal. Puede formatear la cadena con argumentos de su aplicación de esta manera:

Resources res = getResources();
String text = res.getString(R.string.welcome_messages, username, mailCount);
LocalPCGuy
fuente
1
Obtengo java.util.IllegalFormatConversionException:% d no puede formatear java.lang.Dobles argumentos cuando uso $ d creo que $ d es un entero
user1634451
66
Aquí hay una lista de todos los diferentes convertidores, tendrá que elegir el apropiado para el tipo de número, puede necesitar% f (para coma flotante): docs.oracle.com/javase/1.5.0/docs/ api / java / util / Formatter.html
LocalPCGuy
2
res.getString (R.string.welcome_messages, username, mailCount) hará el trabajo. El método getString de recurso / contexto incluye la funcionalidad de formateo.
SkyOasis
104

Debe agregar formatted="false"a su recurso de cadena


Aquí hay un ejemplo

En su strings.xml:

<string name="all" formatted="false">Amount: %.2f%n  for %d days</string>

En su código:

yourTextView.setText(String.format(getString(R.string.all), 3.12, 2));
Sherif elKhatib
fuente
66
No es necesario según los documentos para formatear cadenas. developer.android.com/guide/topics/resources/…
Squonk
Esa es una forma de arreglarlo, pero puede ser confuso para algunos porque formatted="false"podría implicar que la cadena no se formatea.
Ha
18
Tenga en cuenta que puede simplificar String.format(getString(R.string.all), 3.12, 2)de esta manera: getString(R.string.all, 3.12, 2).
patryk.beza
Hay un problema importante con todas las respuestas en esta página: si necesita agregar un signo de porcentaje justo al lado de un parámetro, por ejemplo 25%, Android se bloqueará.
Henrique de Sousa
2
Puede escapar del signo de porcentaje incluyendo dos %%. La siguiente sintaxis de formato estándar. Ejemplo: String.format ("Porcentaje% d %% o como flotante% .2f %%", 12, 12.34f); Generará una cadena "Porcentaje 12% o como flotante 12.34%"
LanDenLabs
14

El archivo interno strings.xmldefine un recurso de cadena como este:

<string name="string_to_format">Amount: %1$f  for %2$d days%3$s</string>

Dentro de su código (suponga que hereda del contexto) simplemente haga lo siguiente:

 String formattedString = getString(R.string.string_to_format, floatVar, decimalVar, stringVar);

(En comparación con la respuesta de LocalPCGuy o Giovanny Farto M., el método String.format no es necesario).

Timo Bähr
fuente
9

Cita de los documentos de Android :

Si necesita formatear sus cadenas usando String.format(String, Object...), entonces puede hacerlo colocando sus argumentos de formato en el recurso de cadena. Por ejemplo, con el siguiente recurso:

<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>

En este ejemplo, la cadena de formato tiene dos argumentos: %1$ses una cadena y %2$des un número decimal. Puede formatear la cadena con argumentos de su aplicación de esta manera:

Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);
Giovanny Farto M.
fuente
0

Para mí funcionó así en Kotlin:

my string.xml

 <string name="price" formatted="false">Price:U$ %.2f%n</string>

my class.kt

 var formatPrice: CharSequence? = null
 var unitPrice = 9990
 formatPrice = String.format(context.getString(R.string.price), unitPrice/100.0)
 Log.d("Double_CharSequence", "$formatPrice")

D / Double_CharSequence: Precio: U $ 99,90

AllanRibas
fuente