Java';s字符串/数字/货币格式化功能

Java';s字符串/数字/货币格式化功能,java,string,formatting,Java,String,Formatting,有没有更容易的方法来理解java中的多种格式化方式是如何相互关联的?我对以下几点感到困惑: System.out.printf() System.out.format() String.format() System.console.format() new Formatter(new StringBuffer("Test")).format(); DecimalFormat.format(value); NumberFormat.format(value); 上面的类/方法在任何情况下都是相

有没有更容易的方法来理解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.printf
System.out.format
String.format
都使用相同的语法和格式标志。我看不出他们三个人有什么不同


谢谢

< p>我会考虑下载JavaDoc和源JAR,用于你相应的java版本,因为所有的问题都可以通过查看源代码和文档来轻松地回答。

System.out.printf(formatString, args)
System.out
是一个
PrintStream.printf(formatString,args)
实际上是对
PrintStream.format(formatString,args)的一种方便的方法调用

这是对
PrintStream.format(formatString,args)
的调用,它使用a来格式化结果并将其附加到
PrintStream

String.format(formatString, args)
此方法还使用
格式化程序
,并返回一个新字符串,其中包含格式化字符串和参数的格式化结果

System.console().format(formatString, args)
System.console()
是一个<代码>控制台。格式化(format,args)
使用
格式化程序
向控制台显示格式化字符串

new Formatter(new StringBuffer("Test")).format(formatString, args);
这将使用传入的字符串缓冲区创建的实例。如果使用此调用,则必须使用
out()
方法获取
格式化程序写入的
可追加的
。相反,您可能希望执行以下操作:

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

DecimalFormat.format(value);
NumberFormat.format(value);
这是两个用于不使用
格式化程序
类的数字的concreate格式化程序。它们都有一个
format
方法,该方法接受一个双精度或
数字
,并根据这些类的定义将它们格式化为字符串。据我所知,
格式化程序不使用它们


希望这有帮助。

它们只是包装格式化程序功能的方便方法。(不确定
NumberFormat
及其子类如何与之关联,即关系的流向。)@Dave但仍然是一个很好的问题,为什么我们有
PrintStream.format
PrintStream.printf
-afaik它们是在同一版本中添加的,并且具有相同的功能。printf的jdocs甚至声明:
此表单out.printf方法的调用(format,args)的行为与调用out.format(format,args)的行为完全相同。
。奇怪的怀疑really@Voo我猜有人添加了所有的
printf
内容,以使
格式
功能更符合
print
/
println
等,但这只是一个猜测。由于各种原因,大多数API都有一定程度的重复——允许不同的风格,以不同的方式传达意图,等等。@Dave Yeah,我想这里没有深刻的神秘解释,所以这只是一个意见问题。就我个人而言,我试图在我的API中完全避免这些事情——引用Python的禅宗
,应该有一种——最好只有一种——显而易见的方法来做到这一点。
。至少javadoc清楚地表明它们是相同的,所以没有人会想“区别在哪里?”(至少没有人读过文档)类似于
DecimalFormat.format(value);
NumberFormat.format(value);