如何在字符串中包含变量?

182

所以,我们都应该知道可以通过以下方式将变量包含在字符串中:

String string = "A string " + aVariable;

有没有一种这样的方式:

String string = "A string {aVariable}";

换句话说:不需要关闭引号并添加加号。这样非常不美观。


20
@Chandra请不要问为什么,而是尽可能地解释一下。这只是我想要的方式。谢谢。 - Gray Adams
3
使用Groovy,您就可以尽情地使用"A string ${aVariable}"。 - Kaleb Brasee
3
这个问题中讨论了许多类似的技术,但String.format()是Java语言内置的。 - ig0774
1
@KalebBrasee 听起来很完美,但是当涉及到修改语言时,我总是有些犹豫。我不想让自己退步。 - Gray Adams
2
@GrayAdams Groovy不会限制你,它会让你自由发挥!:D - Kaleb Brasee
显示剩余4条评论
6个回答

185

你始终可以使用 String.format(....)。例如:

String string = String.format("A String %s %2d", aStringVar, anIntVar);

我不确定这是否足够吸引你,但它可以非常方便。它的语法与printf和java.util.Formatter相同。我经常使用它,特别是当我想显示表格形式的数字数据时。


3
我知道这是一件涉及个人观点的事情,但我不明白为什么format比简单的字符串拼接表达式更有吸引力。在需要填充、数字格式化等操作时,format才能发挥其优势。 - Stephen C
1
@StephenC:我完全不反对你的说法。但是它是一种有用的字符串格式化替代方案,特别是在需要进行填充时,正如你所说,也正如我上面所说的那样(即展示表格化的数字数据)。我经常使用它来格式化血液化学和CBC检查报告。 - Hovercraft Full Of Eels
@owlstead - “当然,让format方法变成静态的是一个可惜的设计失误。” 嗯? format方法如何与目标字符串相关? 您肯定不是在暗示我们应该写成 "A String %s %2d".format(aStringVar, anIntVar)… 是吗? - Stephen C
1
@StephenC 为什么不呢?虽然将该方法重命名为例如 asFormat 更有意义。当然,Eclipse 对静态导入的支持不太好,这使得使用当前的 String.format 有些麻烦。 - Maarten Bodewes
1
@owlstead - "asFormat" 不正确。这意味着该方法正在创建并返回一个格式对象。 - Stephen C
显示剩余3条评论

98

这被称为字符串插值;在Java中并不存在这样的功能。

一种方法是使用String.format:

String string = String.format("A string %s", aVariable);

另一种方法是使用模板库,比如Velocity或者FreeMarker


56

同时考虑一下java.text.MessageFormat,它使用相关的语法来指定参数的索引。例如:

String aVariable = "of ponies";
String string = MessageFormat.format("A string {0}.", aVariable);

结果为包含以下内容的string

A string of ponies.

通常,该类用于数字和时间格式化。关于JFreeChart标签格式化的示例在此处描述;类RCInfo可格式化游戏状态面板。


2
对于从C#来的人来说,这种方式更加直接,因为它类似于C#中的string.Format。 - Mojtaba
我更喜欢这种方式,因为变量的使用更加清晰和可重复利用,相比之下,String.format() 方法就不如此。 - Satch
我更喜欢这种方式,因为变量的清晰和可重用性要比String.format()方法好得多。 - undefined

34
自Java 15以来,您可以使用一个名为String::formatted(Object... args)的非静态字符串方法。
示例:
String foo = "foo";
String bar = "bar";

String str = "First %s, then %s".formatted(foo, bar);     

输出:

"先做 foo,然后再做 bar"


19

Apache Commons TextStringSubstitutor可以使用。请参阅该库的依赖信息以了解如何将其包含在项目中。

import org.apache.commons.text.StringSubstitutor;
// ...
Map<String, String> values = new HashMap<>();
values.put("animal", "quick brown fox");
values.put("target", "lazy dog");
StringSubstitutor sub = new StringSubstitutor(values);
String result = sub.replace("The ${animal} jumped over the ${target}.");
// "The quick brown fox jumped over the lazy dog."

这个类支持为变量提供默认值。
String result = sub.replace("The number is ${undefined.property:-42}.");
// "The number is 42."

要使用递归变量替换,请调用setEnableSubstitutionInVariables(true);
Map<String, String> values = new HashMap<>();
values.put("b", "c");
values.put("ac", "Test");
StringSubstitutor sub = new StringSubstitutor(values);
sub.setEnableSubstitutionInVariables(true);
String result = sub.replace("${a${b}}");
// "Test"

图书馆可以在Maven中央仓库找到。这是Maven依赖项:
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-text</artifactId>
    <version>1.10.0</version>
</dependency>

1
这个答案确实回答了问题。 - AlikElzin-kilaka
这确实完全符合要求。 - Arvind Kumar Avinash

3

您可以使用字符串格式来在字符串中包含变量

我使用这段代码在字符串中包含了两个变量:

String myString = String.format("这是我的字符串 %s %2d", variable1Name, variable2Name);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接