原始问题,但是我如何格式化这样的字符串:
“第{1}步,共{2}步”
通过使用Java替换变量?在C#中,这很简单。
发布于 2011-06-22 05:18:15
除了String.format之外,还可以看看java.text.MessageFormat
。这种格式不那么简洁,更接近于您提供的C#示例,您也可以将其用于解析。
例如:
int someNumber = 42;
String someString = "foobar";
Object[] args = {new Long(someNumber), someString};
MessageFormat fmt = new MessageFormat("String is \"{1}\", number is {0}.");
System.out.println(fmt.format(args));
一个更好的示例利用了Java 1.5中的varargs和自动装箱改进,并将上面的代码转换为一行代码:
MessageFormat.format("String is \"{1}\", number is {0}.", 42, "foobar");
在使用i18nized修饰符做选择复数时,MessageFormat
稍微好一点。要指定在变量为1时正确使用单数形式的消息,否则指定为复数形式的消息,可以这样做:
String formatString = "there were {0} {0,choice,0#objects|1#object|1<objects}";
MessageFormat fmt = new MessageFormat(formatString);
fmt.format(new Object[] { new Long(numberOfObjects) });
发布于 2011-06-22 05:13:05
如果选择不使用String.format,则另一个选项是+二元运算符
String str = "Step " + a + " of " + b;
这相当于
new StringBuilder("Step ").append(String.valueOf(1)).append(" of ").append(String.valueOf(2));
无论使用哪一个,都是您的选择。StringBuilder更快,但速度差异很小。我更喜欢使用+
运算符(它执行StringBuilder.append(String.valueOf(X)))
并发现它更容易阅读。
发布于 2020-09-08 03:06:58
Java 15
从Java15开始,有了一个名为String::formatted(Object... args)
的新实例方法。
内部实现与String::format(String format, Object... args)
相同。
使用此字符串作为格式字符串以及提供的参数进行格式化。
String step1 = "one";
String step2 = "two";
// results in "Step one of two"
String string = "Step %s of %s".formatted(step1, step2);
Advantage:不同之处在于该方法不是static
,并且格式化模式本身是一个字符串,根据args
从该字符串创建一个新的字符串。这允许链接首先构建格式本身。
Disadvantage:Locale
没有重载方法,因此使用默认方法。如果您需要使用自定义Locale
,则必须坚持使用String::format(Locale l,String format,Object... args)
。
https://stackoverflow.com/questions/6431933
复制相似问题