instruction de format dans un fichier de ressources de chaîne

147

J'ai des chaînes définies dans le fichier de ressources habituel strings.xml comme ceci:

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

Est-il possible de définir des chaînes de format telles que celle ci-dessous

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

dans le fichier de ressources strings.xml?

J'ai essayé d'échapper aux caractères spéciaux mais cela ne fonctionne pas.

CocoNess
la source
1
Vous pouvez essayer de la manière ci-dessous: mTextView.setText (String.format ("Score:" + "% 1 $ s", s'exécute)); où int court = 100;
Ganesh

Réponses:

264

Vous n'avez pas besoin d'utiliser formatted="false"dans votre XML. Il vous suffit d'utiliser des marqueurs de format de chaîne complets - %[POSITION]$[TYPE](où [POSITION]est la position de l'attribut et [TYPE]est le type de variable), plutôt que les versions courtes, par exemple %sou %d.

Citation d' Android Docs: Mise en forme et style des chaînes :

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

Dans cet exemple, la chaîne de format a deux arguments: %1$sest une chaîne et %2$dest un entier décimal. Vous pouvez formater la chaîne avec les arguments de votre application comme ceci:

Resources res = getResources();
String text = res.getString(R.string.welcome_messages, username, mailCount);
LocalPCGuy
la source
1
J'obtiens java.util.IllegalFormatConversionException:% d ne peut pas formater java.lang.Double arguments lorsque j'utilise $ d pense que $ d est un entier
user1634451
6
Voici une liste de tous les différents convertisseurs, vous devrez choisir celui qui convient au type de nombre, vous aurez peut-être besoin de% f (pour la virgule flottante): docs.oracle.com/javase/1.5.0/docs/ api / java / util / Formatter.html
LocalPCGuy
2
res.getString (R.string.welcome_messages, nom d'utilisateur, mailCount) fera le travail. La méthode getString de ressource / contexte inclut la fonctionnalité de formatage.
SkyOasis
104

Vous devriez ajouter formatted="false"à votre ressource de chaîne


Voici un exemple

Dans votre strings.xml:

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

Dans votre code:

yourTextView.setText(String.format(getString(R.string.all), 3.12, 2));
Sherif elKhatib
la source
6
Pas nécessaire selon la documentation relative au formatage des chaînes. developer.android.com/guide/topics/resources/…
Squonk
C'est une façon de résoudre, mais cela peut être déroutant pour certains car cela formatted="false"pourrait impliquer que la chaîne ne soit pas formatée. Publié une autre solution stackoverflow.com/a/20887690/228429
LocalPCGuy
18
Notez que vous pouvez simplifier String.format(getString(R.string.all), 3.12, 2)la façon suivante : getString(R.string.all, 3.12, 2).
patryk.beza
Il y a un problème majeur avec toutes les réponses de cette page: si vous devez ajouter un signe de pourcentage juste à côté d'un paramètre, par exemple 25%, Android plantera.
Henrique de Sousa
2
Vous pouvez échapper au signe de pourcentage en incluant deux %%. Cette syntaxe de formatage standard suivante. Exemple: String.format ("Pourcentage% d %% ou comme float% .2f %%", 12, 12.34f); Générera une chaîne "Pourcentage 12% ou sous forme de flottant 12,34%"
LanDenLabs
14

Le fichier strings.xmlinterne définit une ressource String comme ceci:

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

À l'intérieur de votre code (supposons qu'il hérite du contexte), procédez simplement comme suit:

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

(Par rapport à la réponse de LocalPCGuy ou Giovanny Farto M., la méthode String.format n'est pas nécessaire.)

Timo Bähr
la source
9

Citation de Docs Android :

Si vous avez besoin de formater vos chaînes en utilisant String.format(String, Object...), vous pouvez le faire en plaçant vos arguments de format dans la ressource chaîne. Par exemple, avec la ressource suivante:

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

Dans cet exemple, la chaîne de format a deux arguments: %1$sest une chaîne et %2$dest un nombre décimal. Vous pouvez formater la chaîne avec les arguments de votre application comme ceci:

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

Pour moi, cela a fonctionné comme ça à Kotlin:

mon string.xml

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

ma classe.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: Prix: 99,90 $ U

AllanRibas
la source