Sprintf等同于Java

Printf被添加到Java与1.5版本,但我似乎无法find如何将输出发送到一个string,而不是一个文件(这是什么sprintf在C)。 有谁知道如何做到这一点?

// Store the formatted string in 'result' String result = String.format("%4d", i * j); // Write the result to standard output System.out.println( result ); 

请参阅格式及其语法

@erickson。

string是不可变的types。 你不能修改它们,只返回新的string实例。

因此,“foo”.format()没有什么意义,因为它必须被称为like

 string newString = "foo".format(); 

原来的java作者(和.NET作者)决定,在这种情况下,静态方法更有意义,因为您不是在修改“foo”,而是调用格式化方法并传入inputstring。

编辑 :嘿,这个网站有时可以这么有趣。 我提到了string是不可变types的事实。

下面是为什么Format()将作为一个实例方法愚蠢的例子。 在.NET中(也许在Java中),Replace()是一个实例方法。

你可以这样做:

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

但是,没有任何反应,因为string是不可变的。 replace尝试返回一个新的string,但它被分配到什么都没有。

这导致了许多常见的菜鸟错误,如:

 // Contrived Example inputText.Replace(" ","%20"); 

再次,没有任何反应,而是你必须这样做:

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

现在,如果你明白string是不可改变的,那就很有道理。 如果你不这样做,那么你只是困惑。 replace的适当的地方,将是格式是作为string的静态方法:

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

现在不存在什么问题。

真正的问题是,为什么这些框架的作者决定一个应该是一个实例方法,另一个是静态的? 在我看来,两者都更加优雅地performance为静态方法,但是埃里克森似乎认为两者都属于实例方法。

不pipe你的意见如何,事实是你不太可能使用静态版本来犯错误,并且代码更容易理解(没有隐藏的陷阱)。

当然,有一些方法是完美的实例方法,取String.Length()

 int length = "123".Length(); 

在这种情况下,显而易见,我们并不是试图修改“123”,我们只是检查它,并返回它的长度……这是一个实例方法的完美候选人。

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

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

这两种解决scheme都可以模拟printf,但方式不同。 例如,要将值转换为hexstring,您有以下2个解决scheme:

  • format() ,最接近sprintf()

     final static String HexChars = "0123456789abcdef"; public static String getHexQuad(long v) { String ret; if(v > 0xffff) ret = getHexQuad(v >> 16); else ret = ""; ret += String.format("%c%c%c%c", HexChars.charAt((int) ((v >> 12) & 0x0f)), HexChars.charAt((int) ((v >> 8) & 0x0f)), HexChars.charAt((int) ((v >> 4) & 0x0f)), HexChars.charAt((int) ( v & 0x0f))); return ret; } 
  • replace(char oldchar , char newchar) ,有点更快,但相当有限:

      ... ret += "ABCD". replace('A', HexChars.charAt((int) ((v >> 12) & 0x0f))). replace('B', HexChars.charAt((int) ((v >> 8) & 0x0f))). replace('C', HexChars.charAt((int) ((v >> 4) & 0x0f))). replace('D', HexChars.charAt((int) ( v & 0x0f))); ... 
  • 还有第三种解决scheme,只需要逐个添加字符(字符是互相加上的数字),例如:

     ... ret += HexChars.charAt((int) ((v >> 12) & 0x0f))); ret += HexChars.charAt((int) ((v >> 8) & 0x0f))); ... 

…但那真的很丑。