คำสั่งการจัดรูปแบบในไฟล์ทรัพยากรสตริง


147

ฉันมีสตริงที่กำหนดไว้ในไฟล์ resources.xml ปกติเช่นนี้

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

มันเป็นไปได้ที่จะกำหนดสตริงรูปแบบเช่นหนึ่งด้านล่าง

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

ในไฟล์ทรัพยากร strings.xml?

ฉันพยายามหลบหนีอักขระพิเศษ แต่มันไม่ทำงาน


1
คุณสามารถลองในวิธีด้านล่าง: mTextView.setText (String.format ("คะแนน:" + "% 1 $ s", วิ่ง)); โดยที่ int ทำงาน = 100
พระพิฆเนศ

คำตอบ:


264

คุณไม่จำเป็นต้องใช้formatted="false"ใน XML ของคุณ คุณเพียงแค่ต้องใช้เครื่องหมายรูปแบบสตริงที่มีคุณสมบัติครบถ้วน - %[POSITION]$[TYPE](ซึ่ง[POSITION]เป็นตำแหน่งแอตทริบิวต์และ[TYPE]เป็นชนิดตัวแปร) มากกว่ารุ่นสั้นเช่นหรือ%s%d

อ้างอิงจากAndroid เอกสาร: การจัดรูปแบบสตริงและสไตล์ :

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

ในตัวอย่างนี้สตริงรูปแบบมีสองอาร์กิวเมนต์: %1$sเป็นสตริงและ%2$dเป็นจำนวนเต็มทศนิยม คุณสามารถจัดรูปแบบสตริงด้วยอาร์กิวเมนต์จากแอปพลิเคชันของคุณเช่นนี้:

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

1
ฉันได้รับ java.util.IllegalFormatConversionException:% d ไม่สามารถจัดรูปแบบอาร์กิวเมนต์ java.lang.Double เมื่อฉันใช้ $ d คิดว่า $ d เป็นจำนวนเต็ม
user1634451

6
นี่คือรายการของตัวแปลงที่แตกต่างกันทั้งหมดคุณจะต้องเลือกตัวแปลงที่เหมาะสมสำหรับประเภทตัวเลขคุณอาจต้อง% f (สำหรับจุดลอยตัว): docs.oracle.com/javase/1.5.0/docs/ api / java / util / Formatter.html
LocalPCGuy

2
res.getString (R.string.welcome_messages ชื่อผู้ใช้ mailCount) จะทำงาน เมธอด getString ของรีซอร์ส / บริบทรวมถึงฟังก์ชันการจัดรูปแบบ
SkyOasis

104

คุณควรเพิ่มformatted="false"ทรัพยากรสตริงของคุณ


นี่คือตัวอย่าง

ในstrings.xml:

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

ในรหัสของคุณ:

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

6
ไม่จำเป็นตามเอกสารสำหรับการจัดรูปแบบสตริง developer.android.com/guide/topics/resources/…
Squonk

นั่นเป็นวิธีหนึ่งในการแก้ไข แต่อาจสร้างความสับสนให้กับบางคนเพราะformatted="false"อาจหมายความว่าสตริงไม่ได้รับการจัดรูปแบบ โพสต์โซลูชันอื่นstackoverflow.com/a/20887690/228429
LocalPCGuy

18
โปรดทราบว่าคุณสามารถลดความซับซ้อนด้วยวิธีนี้:String.format(getString(R.string.all), 3.12, 2) getString(R.string.all, 3.12, 2)
patryk.beza

มีปัญหาสำคัญกับคำตอบทั้งหมดในหน้านี้: หากคุณจำเป็นต้องเพิ่มเครื่องหมายเปอร์เซ็นต์ถัดจาก param บอกว่า25%Android จะผิดพลาด
Henrique de Sousa

2
คุณสามารถหลีกเลี่ยงเครื่องหมายเปอร์เซ็นต์โดยรวมสอง %% ไวยากรณ์การจัดรูปแบบมาตรฐานต่อไปนี้ ตัวอย่าง: String.format ("เปอร์เซ็นต์% d %% หรือลอย%% .2f %%", 12, 12.34f); จะสร้างสตริง "เปอร์เซ็นต์ 12% หรือลอย 12.34%"
LanDenLabs

14

ภายในไฟล์strings.xmlกำหนดทรัพยากรของสตริงเช่นนี้:

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

ภายในรหัสของคุณ (สมมติว่าสืบทอดมาจากบริบท) เพียงทำดังนี้:

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

(เปรียบเทียบกับคำตอบจากLocalPCGuyหรือGiovanny Farto M.วิธีการ String.format ไม่จำเป็นต้องใช้)


9

อ้างจากเอกสาร Android :

หากคุณต้องการจัดรูปแบบสตริงของคุณโดยใช้String.format(String, Object...)คุณสามารถทำได้โดยใส่อาร์กิวเมนต์รูปแบบของคุณในทรัพยากรสตริง ตัวอย่างเช่นด้วยทรัพยากรต่อไปนี้:

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

ในตัวอย่างนี้สตริงรูปแบบมีสองอาร์กิวเมนต์: %1$sเป็นสตริงและ%2$dเป็นตัวเลขทศนิยม คุณสามารถจัดรูปแบบสตริงด้วยอาร์กิวเมนต์จากแอปพลิเคชันของคุณเช่นนี้:

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

0

สำหรับฉันมันทำงานอย่างนั้นใน Kotlin:

string.xml ของฉัน

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

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: ราคา: U $ 99,90

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.