Formatanweisung in einer String-Ressourcendatei

147

Ich habe Zeichenfolgen in der üblichen string.xml-Ressourcendatei wie folgt definiert:

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

Ist es möglich, Formatzeichenfolgen wie die folgende zu definieren?

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

in der Ressourcendatei strings.xml?

Ich habe versucht, den Sonderzeichen zu entkommen, aber es funktioniert nicht.

CocoNess
quelle
1
Sie können es wie folgt versuchen: mTextView.setText (String.format ("Score:" + "% 1 $ s", läuft)); wobei int läuft = 100;
Ganesh

Antworten:

263

Sie müssen nicht formatted="false"in Ihrem XML verwenden. Sie müssen nur vollständig qualifizierte Zeichenfolgenformatmarkierungen verwenden %[POSITION]$[TYPE](wobei [POSITION]die Attributposition und [TYPE]der Variablentyp sind), anstatt beispielsweise die Kurzversionen %soder %d.

Zitat aus Android Docs: Formatierung und Styling von Zeichenfolgen :

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

In diesem Beispiel hat die Formatzeichenfolge zwei Argumente: %1$sist eine Zeichenfolge und %2$deine Dezimalzahl. Sie können die Zeichenfolge mit Argumenten aus Ihrer Anwendung wie folgt formatieren:

Resources res = getResources();
String text = res.getString(R.string.welcome_messages, username, mailCount);
LocalPCGuy
quelle
1
Ich erhalte java.util.IllegalFormatConversionException:% d kann java.lang.Double-Argumente nicht formatieren, wenn ich $ d verwende. Ich denke, $ d ist eine Ganzzahl
user1634451
6
Hier ist eine Liste aller verschiedenen Konverter. Sie müssen den entsprechenden für den Zahlentyp auswählen. Möglicherweise benötigen Sie% f (für Gleitkomma): docs.oracle.com/javase/1.5.0/docs/ api / java / util / Formatter.html
LocalPCGuy
2
res.getString (R.string.welcome_messages, Benutzername, mailCount) erledigt den Job. Die getString-Methode für Ressource / Kontext enthält die Formatierungsfunktion.
SkyOasis
104

Sie sollten formatted="false"Ihrer Zeichenfolgenressource hinzufügen


Hier ist ein Beispiel

In Ihrem strings.xml:

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

In Ihrem Code:

yourTextView.setText(String.format(getString(R.string.all), 3.12, 2));
Sherif elKhatib
quelle
6
Nicht erforderlich gemäß den Dokumenten zum Formatieren von Zeichenfolgen. developer.android.com/guide/topics/resources/…
Squonk
Dies ist eine Möglichkeit, dies zu beheben, kann jedoch für einige verwirrend sein, da formatted="false"dies bedeuten könnte, dass die Zeichenfolge nicht formatiert wird. Gepostet eine
LocalPCGuy
17
Beachten Sie, dass Sie dies folgendermaßen vereinfachen String.format(getString(R.string.all), 3.12, 2)können : getString(R.string.all, 3.12, 2).
patryk.beza
Bei allen Antworten auf dieser Seite gibt es ein großes Problem: Wenn Sie ein Prozentzeichen direkt neben einem Parameter hinzufügen müssen, stürzt beispielsweise 25%Android ab.
Henrique de Sousa
2
Sie können dem Prozentzeichen entkommen, indem Sie zwei %% einfügen. Dies ist die folgende Standardformatierungssyntax. Beispiel: String.format ("Prozent% d %% oder als float% .2f %%", 12, 12.34f); Erzeugt eine Zeichenfolge "Prozent 12% oder als Float 12,34%"
LanDenLabs
14

Innerhalb der Datei strings.xmldefinieren Sie eine String-Ressource wie folgt:

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

Gehen Sie in Ihrem Code (vorausgesetzt, er erbt vom Kontext) einfach wie folgt vor:

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

(Im Vergleich zur Antwort von LocalPCGuy oder Giovanny Farto M. wird die String.format-Methode nicht benötigt.)

Timo Bähr
quelle
9

Zitat aus Android Docs :

Wenn Sie Ihre Zeichenfolgen mit formatieren müssen, String.format(String, Object...)können Sie dies tun, indem Sie Ihre Formatargumente in die Zeichenfolgenressource einfügen. Zum Beispiel mit der folgenden Ressource:

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

In diesem Beispiel hat die Formatzeichenfolge zwei Argumente: %1$sist eine Zeichenfolge und %2$deine Dezimalzahl. Sie können die Zeichenfolge mit Argumenten aus Ihrer Anwendung wie folgt formatieren:

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

Bei mir hat es in Kotlin so geklappt:

meine string.xml

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

meine 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: Preis: U $ 99,90

AllanRibas
quelle