istruzione di formato in un file di risorse stringa


147

Ho le stringhe definite nel solito file di risorse strings.xml in questo modo:

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

È possibile definire stringhe di formato come quella qui sotto

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

nel file di risorse strings.xml?

Ho provato a sfuggire ai personaggi speciali ma non funziona.


1
Puoi provare nel modo seguente: mTextView.setText (String.format ("Score:" + "% 1 $ s", run)); dove int corre = 100;
Ganesh,

Risposte:


264

Non è necessario utilizzare formatted="false"nel proprio XML. Hai solo bisogno di usare marcatori di formato stringa pienamente qualificati - %[POSITION]$[TYPE](dove si [POSITION]trova la posizione dell'attributo ed [TYPE]è il tipo di variabile), piuttosto che le versioni brevi, per esempio %so %d.

Citazione da documenti Android: formattazione e styling delle stringhe :

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

In questo esempio, la stringa di formato ha due argomenti: %1$sè una stringa ed %2$dè un numero intero decimale. Puoi formattare la stringa con argomenti della tua applicazione in questo modo:

Resources res = getResources();
String text = res.getString(R.string.welcome_messages, username, mailCount);

1
Ottengo java.util.IllegalFormatConversionException:% d non riesco a formattare java.lang. Doppi argomenti quando uso $ d penso che $ d sia un numero intero
user1634451

6
Ecco un elenco di tutti i diversi convertitori, dovrai scegliere quello appropriato per il tipo di numero, potresti aver bisogno di% f (per virgola mobile): docs.oracle.com/javase/1.5.0/docs/ api / java / util / Formatter.html
LocalPC Acquista il

2
res.getString (R.string.welcome_messages, username, mailCount) farà il lavoro. Il metodo getString di risorsa / contesto include la funzionalità di formattazione.
SkyOasis,

104

È necessario aggiungere formatted="false"alla risorsa stringa


Ecco un esempio

Nel tuo strings.xml:

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

Nel tuo codice:

yourTextView.setText(String.format(getString(R.string.all), 3.12, 2));

6
Non necessario secondo i documenti per le stringhe di formattazione. developer.android.com/guide/topics/resources/…
Squonk,

Questo è un modo per risolvere, ma potrebbe essere fonte di confusione per alcuni perché formatted="false"potrebbe implicare che la stringa non venga formattata. Pubblicato un'altra soluzione stackoverflow.com/a/20887690/228429
LocalPCGuy

18
Si noti che è possibile semplificare String.format(getString(R.string.all), 3.12, 2)in questo modo: getString(R.string.all, 3.12, 2).
patryk.beza,

C'è un grosso problema con tutte le risposte in questa pagina: se devi aggiungere un segno di percentuale proprio accanto a un parametro, diciamo 25%, Android andrà in crash.
Henrique de Sousa,

2
Puoi sfuggire al segno di percentuale includendo due %%. Questa seguente sintassi di formattazione standard. Esempio: String.format ("Percentuale% d %% o come float% .2f %%", 12, 12.34f);
Genererà

14

All'interno del file strings.xmldefinire una risorsa String come questa:

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

All'interno del tuo codice (supponi che erediti dal contesto) devi semplicemente fare quanto segue:

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

(Rispetto alla risposta di LocalPCGuy o Giovanny Farto M. il metodo String.format non è necessario.)


9

Citazione da documenti Android :

Se è necessario formattare le stringhe utilizzando String.format(String, Object...), è possibile farlo inserendo gli argomenti del formato nella risorsa stringa. Ad esempio, con la seguente risorsa:

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

In questo esempio, la stringa di formato ha due argomenti: %1$sè una stringa ed %2$dè un numero decimale. Puoi formattare la stringa con argomenti della tua applicazione in questo modo:

Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);

0

Per me ha funzionato così a Kotlin:

my string.xml

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

il mio 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: Prezzo: U $ 99,90

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.