字符串资源文件中的format语句


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(“ Score:” +“%1 $ s”,运行));其中int = 100;
Ganesh,2015年

Answers:


263

您不需要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时,%d无法格式化java.lang.Double参数,认为$ d是整数
user1634451 2014年

6
这是所有不同转换器的列表,您必须为数字类型选择合适的转换器,您可能需要%f(用于浮点数):docs.oracle.com/javase/1.5.0/docs/ api / java / util / Formatter.html
LocalPCGuy 2014年

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/...
湿眶客

这是一种解决方法,但可能会使某些人感到困惑,因为这formatted="false"可能意味着字符串未格式化。发表了另一个解决方案stackoverflow.com/a/20887690/228429
LocalPCGuy 2014年

18
请注意,您可以通过String.format(getString(R.string.all), 3.12, 2)以下方式进行简化:getString(R.string.all, 3.12, 2)
patryk.beza '16

此页面上的所有答案都存在一个主要问题:如果您需要在参数旁边添加百分号,例如25%,Android将会崩溃。
Henrique de Sousa

2
您可以通过包含两个%%来逃避百分号。这遵循标准格式语法。示例:String.format(“百分比%d %%或以浮动%.2f %%”,12、12.34f);将生成字符串“百分比为12%或为浮动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);

(与LocalPCGuyGiovanny Farto M的回答相比,不需要String.format方法。)


9

引用来自Android文档

如果您需要使用来格式化字符串String.format(String, Object...),则可以通过将format参数放在字符串资源中来实现。例如,使用以下资源:

<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

对我来说,它在科特林像这样运作:

我的string.xml

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

我的课

 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_Char序列:价格:U $ 99,90

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.