嵌套格式的Java字符串格式不显示实际输出

嵌套格式的Java字符串格式不显示实际输出,java,string,Java,String,为什么这在Java中不起作用,而在C中却起作用 预期产出: Hello World 实际产量: Hello %s 你可以这样格式化它 String a = "Hello %s"; String b = "World"; String c = String.format(a, b); String#format不会计算已解析的模式,以检查是否还有任何标记。它接受替换参数并将其“按原样”插入格式中指定的必需位置。所以你在那里所做的就是你在输出上所看到的——首先进行替换。由于格式中没有更多的令牌

为什么这在Java中不起作用,而在C中却起作用

预期产出:

Hello World
实际产量:

Hello %s

你可以这样格式化它

String a = "Hello %s";
String b = "World";
String c = String.format(a, b);
String#format
不会计算已解析的模式,以检查是否还有任何标记。它接受替换参数并将其“按原样”插入格式中指定的必需位置。所以你在那里所做的就是你在输出上所看到的——首先进行替换。由于格式中没有更多的令牌,
b
被忽略

但是,格式本身可能是可变的,因此您可能希望这样做:

String a = "Hello %s";
String b = "World";
String c = String.format(a, b);

这将为您提供
Hello World
中的
c

如果我们看一下java,没有需要指定表达式(“%s”)的
String#format
实现。您的用例的正确用法应该是
String.format(“Hello%s”,“World”)

在您的情况下,
“%s”
将替换为指定的第一个参数,该参数恰好是
“Hello%s”
。导致输出为:“Hello%s”


如果您想了解更多有关所有可能格式的信息,请查看java文档页。

这样做是行不通的。java不是C#。那么
String.format(“%s%s”,a,b)”呢
那么从逻辑上讲,这是错误的,指定了%s 3种格式,但只填充了值。在
String.format
中使用的
String
与该方法生成的
String
之间存在差异。在参数中,您只有一个
%s
。这是逻辑,因为
String
是不可变的。说句公道话,这会有用的,但这不是它的工作原理。我不明白你的意思。您所说的“没有需要指定模式的
String#format
实现”是什么意思。您刚刚提供了
String.format
的文档以了解基本用法。我搜索了,但没有找到任何提及格式a值的内容,因此它不会真正回答此问题。如本问题示例所示,用户使用
String.format(“%s”,a,b)指定模式。这可能会令人困惑,因为
“Hello%s”
可以被视为模式,但
“%s”
也可以被视为模式。但是对于
“%s”
来说,表达式是一个更好的词。我不完全明白你的意思,为什么我的答案不正确,因为它不能解释为什么值中的“表达式”本身不被视为表达式。您只提供了解释基本用法的链接(这并不是真正正确的),但我在任何地方都找不到在值中提到表达式的地方,因此这并不是回答OP的问题,而是解释如何使用
String.format
。这就是为什么你的答案对我来说不完整。谢谢你的解释。我同意你的看法,并将更新我的答案。
String a = "Hello %s";
String b = "World";
String c = String.format(a, b);