Java 中的 Sprintf 等效项

2022-08-31 05:08:10

Printf在1.5版本中被添加到Java中,但我似乎找不到如何将输出发送到字符串而不是文件(这就是sprintf在C中所做的)。有人知道如何做到这一点吗?


答案 1
// Store the formatted string in 'result'
String result = String.format("%4d", i * j);

// Write the result to standard output
System.out.println( result );

请参阅格式及其语法


答案 2

字符串是不可变的类型。您无法修改它们,只能返回新的字符串实例。

因此,使用实例方法进行格式化没有多大意义,因为它必须像这样调用:

String formatted = "%s: %s".format(key, value);

原始 Java 作者(和 .NET 作者)认为静态方法在这种情况下更有意义,因为您不是在修改目标,而是调用格式方法并传入输入字符串。

下面是一个示例,说明为什么作为实例方法会很愚蠢。在.NET中(可能在Java中),是一个实例方法。format()Replace()

您可以执行以下操作:

 "I Like Wine".Replace("Wine","Beer");

但是,没有任何反应,因为字符串是不可变的。 尝试返回新字符串,但未将其赋值给任何内容。Replace()

这会导致许多常见的新手错误,例如:

inputText.Replace(" ", "%20");

同样,什么也没发生,相反,你必须做:

inputText = inputText.Replace(" ","%20");

现在,如果您了解字符串是不可变的,那么这非常有意义。如果你不这样做,那么你只是感到困惑。正确的位置是 where is,作为以下的静态方法:Replace()format()String

 inputText = String.Replace(inputText, " ", "%20");

现在毫无疑问发生了什么。

真正的问题是,为什么这些框架的作者决定一个应该是实例方法,而另一个是静态的?在我看来,两者都更优雅地表达为静态方法。

不管你的观点如何,事实是你使用静态版本不容易犯错误,代码更容易理解(No Hidden Gotchas)。

当然,有一些方法可以完美地作为实例方法,取 String.Length()

int length = "123".Length();

在这种情况下,很明显我们不是试图修改“123”,我们只是检查它,并返回它的长度。这是实例方法的完美候选者。

我对不可变对象上的实例方法的简单规则:

  • 如果需要返回相同类型的新实例,请使用静态方法。
  • 否则,请使用实例方法。