pap*_*rse 279 java string formatting
Printf在1.5版本中被添加到Java中,但我似乎无法找到如何将输出发送到字符串而不是文件(这是sprintf在C中执行的操作).有谁知道如何做到这一点?
Eug*_*ota 465
// Store the formatted string in 'result'
String result = String.format("%4d", i * j);
// Write the result to standard output
System.out.println( result );
Run Code Online (Sandbox Code Playgroud)
Fly*_*wat 25
@erickson.
字符串是不可变类型.您无法修改它们,只返回新的字符串实例.
因此,"foo".format()没什么意义,因为它必须被称为
string newString = "foo".format();
Run Code Online (Sandbox Code Playgroud)
最初的java作者(和.NET作者)认为静态方法在这种情况下更有意义,因为你没有修改"foo",而是调用格式方法并传入输入字符串.
编辑:嘿,这个网站有时可以很有趣.我因为提到字符串是不可变类型这一事实而被投票.
这是一个为什么Format()作为实例方法愚蠢的例子.在.NET中(可能在Java中),Replace()是一种实例方法.
你可以这样做:
"I Like Wine".Replace("Wine","Beer");
Run Code Online (Sandbox Code Playgroud)
但是,没有任何反应,因为字符串是不可变的.替换尝试返回一个新字符串,但它被分配给任何内容.
这导致许多常见的菜鸟错误,如:
// Contrived Example
inputText.Replace(" ","%20");
Run Code Online (Sandbox Code Playgroud)
再一次,没有任何反应,而你必须这样做:
inputText = inputText.Replace(" ","%20");
Run Code Online (Sandbox Code Playgroud)
现在,如果您了解字符串是不可变的,那就非常有意义了.如果你不这样做,那你就困惑了.替换的正确位置是Format的位置,作为String的静态方法:
inputText = String.Replace(inputText," ", "%20");
Run Code Online (Sandbox Code Playgroud)
现在毫无疑问,最新情况如何.
真正的问题是,为什么这些框架的作者决定一个应该是一个实例方法,另一个是静态的?在我看来,两者都更优雅地表达为静态方法,但erickson似乎认为它们都属于实例方法.
无论您的意见如何,事实是您不太容易使用静态版本出错,并且代码更容易理解(No Hidden Gotchas).
当然有一些方法是完美的实例方法,取String.Length()
int length = "123".Length();
Run Code Online (Sandbox Code Playgroud)
在这种情况下,显而易见我们不是要修改"123",我们只是检查它,并返回它的长度......这是实例方法的完美候选.
我对不可变对象的实例方法的简单规则:
从 Java 13 开始,您在 String 上有formatted 1 个方法,该方法与文本块一起作为预览功能2添加。你可以用它代替String.format()
Assertions.assertEquals(
"%s %d %.3f".formatted("foo", 123, 7.89),
"foo 123 7.890"
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
187889 次 |
| 最近记录: |