формат заяви у файлі рядкових ресурсів


147

У мене є рядки, визначені у звичайному файлі ресурсу strings.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.Подвійні аргументи, коли я використовую $ 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

Існує велика проблема з усіма відповідями на цій сторінці: Якщо вам потрібно додати знак відсотка поруч із парам, скажімо 25%, Android вийде з ладу.
Анріке де Соуза

2
Ви можете уникнути знака відсотка, включивши два %%. Це наступний синтаксис стандартного форматування. Приклад: String.format ("Відсоток% d %% або як float% .2f %%", 12, 12.34f);
Згенерує

14

У внутрішньому файлі strings.xmlвизначте ресурс String таким чином:

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

Всередині коду (припустимо, що він успадковується від Context) просто виконайте наступне:

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

(У порівнянні з відповіддю LocalPCGuy або Джованні Фарто М. метод 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

Для мене це працювало так у Котліні:

мій рядок.xml

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

мій клас.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: Ціна: 99,90 дол

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.