оператор формата в строковом файле ресурсов

153

У меня есть строки, определенные в обычном файле ресурсов 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 ("Score:" + "% 1 $ s", выполняется)); где int работает = 100;
Ганеш

Ответы:

274

Вам не нужно использовать formatted="false"в своем XML. Вам просто нужно использовать полностью определенные маркеры строкового формата - %[POSITION]$[TYPE](где [POSITION]- позиция атрибута, а [TYPE]- тип переменной), а не короткие версии, например %sили %d.

Цитата из Android Docs: Форматирование и стили строк :

<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);
LocalPCGuy
источник
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
2
res.getString (R.string.welcome_messages, username, mailCount) выполнит эту работу. Метод getString ресурса / контекста включает в себя функции форматирования.
SkyOasis
105

Вы должны добавить 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 02
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); Будет сгенерирована строка «Percent 12% or as float 12.34%»
LanDenLabs,
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 Docs :

Если вам нужно отформатировать строки с помощью 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);
Джованни Фарто М.
источник
2

Для меня в Котлине так работало:

мой 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: Цена: 99,90 долларов США

Для еще лучшего результата мы можем сделать это

 <string name="price_to_string">Price:U$ %1$s</string>

 var formatPrice: CharSequence? = null
 var unitPrice = 199990
 val numberFormat = (unitPrice/100.0).toString()
 formatPrice = String.format(context.getString(R.string.price_to_string), formatValue(numberFormat))

  fun formatValue(value: String) :String{
    val mDecimalFormat = DecimalFormat("###,###,##0.00")
    val s1 = value.toDouble()
    return mDecimalFormat.format(s1)
 }

 Log.d("Double_CharSequence", "$formatPrice")

D / Double_CharSequence: Цена: U $ 1.999,90

Аллан Рибас
источник