định dạng câu lệnh trong một tệp tài nguyên chuỗi


147

Tôi có các chuỗi được định nghĩa trong tệp Tài nguyên String.xml thông thường như thế này:

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

Có thể định nghĩa các chuỗi định dạng như chuỗi bên dưới không

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

trong tệp tài nguyên String.xml?

Tôi đã cố gắng thoát khỏi các nhân vật đặc biệt nhưng nó không hoạt động.


1
Bạn có thể thử theo cách bên dưới: mTextView.setText (String.format ("Điểm:" + "% 1 $ s", chạy)); trong đó int chạy = 100;
Ganesh

Câu trả lời:


264

Bạn không cần sử dụng formatted="false"XML của mình. Bạn chỉ cần sử dụng các dấu định dạng chuỗi đủ điều kiện - %[POSITION]$[TYPE]( [POSITION]vị trí thuộc tính và [TYPE]là loại biến), chứ không phải là các phiên bản ngắn, ví dụ %shoặc %d.

Trích dẫn từ Tài liệu Android: Định dạng và định dạng chuỗi :

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

Trong ví dụ này, chuỗi định dạng có hai đối số: %1$slà một chuỗi và %2$dlà một số nguyên thập phân. Bạn có thể định dạng chuỗi với các đối số từ ứng dụng của bạn như thế này:

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

1
Tôi nhận java.util.IllegalFormatConversionException:% d không thể định dạng java.lang. Các đối số khi tôi sử dụng $ d nghĩ $ d là một số nguyên
user1634451

6
Dưới đây là danh sách tất cả các bộ chuyển đổi khác nhau, bạn sẽ phải chọn loại thích hợp cho loại số, bạn có thể cần% f (cho dấu phẩy động): docs.oracle.com/javase/1.5.0/docs/ api / java /
produc

2
res.getString (R.opes.welcome_messages, tên người dùng, mailCount) sẽ thực hiện công việc. Phương thức getString của tài nguyên / ngữ cảnh bao gồm chức năng định dạng.
SkyOocation

104

Bạn nên thêm formatted="false"vào tài nguyên chuỗi của bạn


Đây là một ví dụ

Trong của bạn strings.xml:

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

Trong mã của bạn:

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

6
Không cần thiết theo các tài liệu cho chuỗi định dạng. developer.android.com/guide/topics/resource/ từ
Squonk

Đó là một cách để khắc phục, nhưng có thể gây nhầm lẫn cho một số người vì formatted="false"có thể ngụ ý chuỗi không được định dạng. Đã đăng một giải pháp khác stackoverflow.com/a/20887690/228429
LocalPCGuy

18
Lưu ý rằng bạn có thể đơn giản hóa String.format(getString(R.string.all), 3.12, 2)theo cách này : getString(R.string.all, 3.12, 2).
patryk.beza

Có một vấn đề lớn với tất cả các câu trả lời trong trang này: Nếu bạn cần thêm một dấu phần trăm ngay bên cạnh một thông số, giả sử 25%, Android sẽ gặp sự cố.
Henrique de Sousa

2
Bạn có thể thoát dấu phần trăm bằng cách bao gồm hai %%. Đây là cú pháp định dạng tiêu chuẩn. Ví dụ: String.format ("Phần trăm% d %% hoặc dưới dạng float% .2f %%", 12, 12.34f); Sẽ tạo ra một chuỗi "Phần trăm 12% hoặc là float 12,34%"
LanDenLabs

14

Tệp bên trong strings.xmlxác định tài nguyên Chuỗi như thế này:

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

Bên trong mã của bạn (giả sử nó thừa hưởng từ Ngữ cảnh) chỉ cần làm như sau:

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

(So ​​với câu trả lời từ LocalPCGuy hoặc Giovanny Farto M. phương thức String.format là không cần thiết.)


9

Trích dẫn từ Tài liệu Android :

Nếu bạn cần định dạng chuỗi của mình bằng cách sử dụng String.format(String, Object...), thì bạn có thể làm như vậy bằng cách đặt đối số định dạng của mình vào tài nguyên chuỗi. Ví dụ: với tài nguyên sau:

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

Trong ví dụ này, chuỗi định dạng có hai đối số: %1$slà một chuỗi và %2$dlà số thập phân. Bạn có thể định dạng chuỗi với các đối số từ ứng dụng của bạn như thế này:

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

0

Đối với tôi, nó hoạt động như thế trong Kotlin:

chuỗi của tôi

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

lớp của tôi

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.