format w pliku zasobów ciągu

147

Mam ciągi zdefiniowane w zwykłym pliku zasobów strings.xml w następujący sposób:

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

Czy można zdefiniować ciągi formatujące, takie jak ten poniżej

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

w pliku zasobów strings.xml?

Próbowałem uciec od znaków specjalnych, ale to nie działa.

CocoNess
źródło
1
Możesz spróbować w następujący sposób: mTextView.setText (String.format ("Score:" + "% 1 $ s", działa)); gdzie int działa = 100;
Ganesh

Odpowiedzi:

264

Nie musisz używać formatted="false"w swoim XML. Wystarczy użyć w pełni kwalifikowanych znaczników formatu ciągu - %[POSITION]$[TYPE](gdzie [POSITION]jest pozycją atrybutu i [TYPE]jest typem zmiennej), a nie krótkich wersji, na przykład %slub %d.

Cytat z Android Docs: Formatowanie i stylizacja napisów :

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

W tym przykładzie łańcuch formatu ma dwa argumenty: %1$sjest ciągiem znaków i %2$ddziesiętną liczbą całkowitą. Możesz sformatować ciąg za pomocą argumentów z aplikacji w następujący sposób:

Resources res = getResources();
String text = res.getString(R.string.welcome_messages, username, mailCount);
LocalPCGuy
źródło
1
Dostaję java.util.IllegalFormatConversionException:% d nie może sformatować java.lang.Double arguments, gdy używam $ d, myślę, że $ d jest liczbą całkowitą
user1634451
6
Oto lista wszystkich różnych konwerterów, będziesz musiał wybrać odpowiedni dla typu liczby, możesz potrzebować% f (dla zmiennoprzecinkowych): docs.oracle.com/javase/1.5.0/docs/ api / java / util / Formatter.html
LocalPCGuy
2
res.getString (R.string.welcome_messages, nazwa użytkownika, mailCount) wykona zadanie. Metoda getString zasobu / kontekstu obejmuje funkcję formatowania.
SkyOasis
104

Należy dodać formatted="false"do swojego zasobu ciągu


Oto przykład

W twoim strings.xml:

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

W swoim kodzie:

yourTextView.setText(String.format(getString(R.string.all), 3.12, 2));
Sherif elKhatib
źródło
6
Nie jest konieczne zgodnie z dokumentacją dotyczącą formatowania ciągów. developer.android.com/guide/topics/resources/…
Squonk,
Jest to jeden ze sposobów naprawienia, ale może być mylący dla niektórych, ponieważ formatted="false"może oznaczać, że ciąg nie jest formatowany. Opublikowane kolejne rozwiązanie stackoverflow.com/a/20887690/228429
LocalPCGuy
18
Należy pamiętać, że można uprościć String.format(getString(R.string.all), 3.12, 2)w ten sposób: getString(R.string.all, 3.12, 2).
patryk.beza 20.04.2016
Istnieje poważny problem ze wszystkimi odpowiedziami na tej stronie: jeśli chcesz dodać znak procentu tuż obok parametru, powiedzmy 25%, Android ulegnie awarii.
Henrique de Sousa
2
Możesz pominąć znak procentu, dodając dwa %%. Poniższa standardowa składnia formatowania. Przykład: String.format ("Procent% d %% lub jako float% .2f %%", 12, 12,34f);
Wygeneruje
14

Wewnątrz pliku strings.xmlzdefiniuj zasób String w następujący sposób:

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

Wewnątrz swojego kodu (załóżmy, że dziedziczy on po Context) po prostu wykonaj następujące czynności:

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

(W porównaniu z odpowiedzią z LocalPCGuy lub Giovanny Farto M. metoda String.format nie jest potrzebna.)

Timo Bähr
źródło
9

Cytat z Dokumentów na Androida :

Jeśli chcesz sformatować swoje ciągi przy użyciu String.format(String, Object...), możesz to zrobić, umieszczając argumenty formatu w zasobie ciągu. Na przykład z następującym zasobem:

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

W tym przykładzie ciąg formatu ma dwa argumenty: %1$sjest łańcuchem i %2$djest liczbą dziesiętną. Możesz sformatować ciąg za pomocą argumentów z aplikacji w następujący sposób:

Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);
Giovanny Farto M.
źródło
0

U mnie tak to działało w Kotlinie:

mój string.xml

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

moja 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: Cena: 99,90 USD

AllanRibas
źródło