pernyataan format dalam file sumber daya string

147

Saya memiliki string yang didefinisikan dalam file Resource strings.xml yang biasa seperti ini:

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

Apakah mungkin untuk mendefinisikan string format seperti yang di bawah ini

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

dalam file sumber daya strings.xml?

Saya mencoba melarikan diri dari karakter khusus tetapi tidak berfungsi.

CocoNess
sumber
1
Anda dapat mencoba dengan cara di bawah ini: mTextView.setText (String.format ("Score:" + "% 1 $ s", running)); di mana int running = 100;
Ganesh

Jawaban:

264

Anda tidak perlu menggunakan formatted="false"XML Anda. Anda hanya perlu menggunakan penanda format string yang sepenuhnya memenuhi syarat - %[POSITION]$[TYPE](di mana [POSITION]posisi atribut dan [TYPE]tipe variabel), daripada versi pendek, misalnya %satau %d.

Kutipan dari Android Docs: String Formatting and Styling :

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

Dalam contoh ini, format string memiliki dua argumen: %1$sadalah string dan %2$dbilangan bulat desimal. Anda dapat memformat string dengan argumen dari aplikasi Anda seperti ini:

Resources res = getResources();
String text = res.getString(R.string.welcome_messages, username, mailCount);
LocalPCGuy
sumber
1
Saya mendapatkan java.util.IllegalFormatConversionException:% d tidak dapat memformat argumen java.lang.Double ketika saya menggunakan $ d berpikir $ d adalah bilangan bulat
user1634451
6
Berikut adalah daftar dari semua konverter yang berbeda, Anda harus memilih yang sesuai untuk tipe angka, Anda mungkin perlu% f (untuk floating point): docs.oracle.com/javase/1.5.0/docs/ api / java / util / Formatter.html
LocalPCGuy
2
res.getString (R.string.welcome_messages, nama pengguna, mailCount) akan melakukan pekerjaan itu. Metode getString dari sumber daya / konteks mencakup fungsi pemformatan.
SkyOasis
104

Anda harus menambahkan formatted="false"ke sumber daya string Anda


Berikut ini sebuah contoh

Di Anda strings.xml:

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

Dalam kode Anda:

yourTextView.setText(String.format(getString(R.string.all), 3.12, 2));
Sherif elKhatib
sumber
6
Tidak perlu menurut dokumen untuk memformat string. developer.android.com/guide/topics/resources/…
Squonk
Itu adalah salah satu cara untuk memperbaikinya, tetapi mungkin membingungkan bagi sebagian orang karena formatted="false"dapat menyiratkan string tidak diformat. Diposting solusi lain stackoverflow.com/a/20887690/228429
LocalPCGuy
18
Perhatikan bahwa Anda dapat menyederhanakan String.format(getString(R.string.all), 3.12, 2)cara ini: getString(R.string.all, 3.12, 2).
patryk.beza
Ada masalah besar dengan semua jawaban di halaman ini: Jika Anda perlu menambahkan tanda persen tepat di sebelah param, katakanlah 25%, Android akan macet.
Henrique de Sousa
2
Anda dapat keluar dari tanda persen dengan memasukkan dua %%. Berikut ini sintaks pemformatan standar. Contoh: String.format ("Persen% d %% atau sebagai float% .2f %%", 12, 12.34f); Akan menghasilkan string "Persen 12% atau mengapung 12,34%"
LanDenLabs
14

File di dalam strings.xmlmenentukan sumber daya String seperti ini:

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

Di dalam kode Anda (anggap itu mewarisi dari Konteks) cukup lakukan hal berikut:

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

(Dibandingkan dengan jawaban dari LocalPCGuy atau Giovanny Farto M. metode String.format tidak diperlukan.)

Timo Bähr
sumber
9

Kutipan dari Android Docs :

Jika Anda perlu memformat string Anda menggunakan String.format(String, Object...), maka Anda dapat melakukannya dengan meletakkan argumen format Anda di sumber daya string. Misalnya, dengan sumber daya berikut:

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

Dalam contoh ini, format string memiliki dua argumen: %1$sadalah string dan %2$dangka desimal. Anda dapat memformat string dengan argumen dari aplikasi Anda seperti ini:

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

Bagi saya itu bekerja seperti itu di Kotlin:

string.xml saya

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

kelas saya

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

AllanRibas
sumber