2011-12-31 75 views
4

有什麼更容易的方法來理解java中的各種格式化方式是如何相關的?我對以下內容感到困惑:Java的字符串/數字/貨幣格式化功能

System.out.printf() 
System.out.format() 
String.format() 
System.console.format() 
new Formatter(new StringBuffer("Test")).format(); 
DecimalFormat.format(value); 
NumberFormat.format(value); 

上面的類/方法是否與之相關?瞭解差異以及在哪種情況下使用哪種方法最好的方法是什麼?

作爲示例,System.out.printfSystem.out.formatString.format都使用相同的語法和格式標誌。我看不出他們三人有什麼不同。

感謝

+1

它們只是包裝'Formatter'功能的簡便方法。 (不知道'NumberFormat'及其子類是如何與之相關的,即關係是以哪種方式流動的。) – 2011-12-31 16:51:37

+0

@Dave但是仍然是一個很好的問題,爲什麼我們有'PrintStream.format'和'PrintStream.printf' - afaik他們在同一版本中添加並具有相同的功能。用於printf偶數狀態的jdocs:'調用out.printf(format,args)形式的此方法的行爲與調用out.format(format,args)'的行爲完全相同。奇怪的發佈確實 – Voo 2011-12-31 17:12:55

+0

@Voo我猜想有人添加了所有'printf'的東西來保持'format'功能更符合'print' /'println'等,但這只是一個猜測。大多數API都有一定量的重複,出於各種原因 - 允許不同的樣式,以不同的方式表達意圖等等。 – 2011-12-31 17:17:52

回答

4

我會考慮下載你對應的Java版本的Javadoc和源罐子,因爲你所有的問題可以很容易地通過查看源文件來回答。

System.out.printf(formatString, args) 

System.outPrintStreamPrintStream.printf(formatString, args)實際上是一個方便的方法調用PrintStream.format(formatString, args);

System.out.format(formatString, args) 

這是PrintStream.format(formatString, args)調用它採用了Formatter格式化結果並將其追加到PrintStream

String.format(formatString, args) 

這種方法也使用了Formatter並返回與格式字符串和args的格式化結果一個新的字符串。

System.console().format(formatString, args) 

System.console()ConsoleConsole.format(format, args)使用Formatter向控制檯顯示格式化的字符串。

new Formatter(new StringBuffer("Test")).format(formatString, args); 

這將創建使用傳遞的字符串緩衝區Formatter的一個實例。如果你使用這個電話,那麼你將不得不使用out()方法來獲得由Formatter寫入Appendable。相反,你可能想要做這樣的事情:

StringBuffer sb = new StringBuffer("Test"); 
new Formatter(sb).format(formatString, args); 
// now do something with sb.toString() 

最後:

DecimalFormat.format(value); 
NumberFormat.format(value); 

這些是值的兩種concreate格式化是做使用Formatter類。 DecimalFormatNumerFormat都有一個format方法,它採用雙精度或者Number,並根據這些類的定義將它們格式化爲字符串。據我所知,Formatter不使用它們。

希望這會有所幫助。