格式化

原文: https://docs.oracle.com/javase/tutorial/essential/io/formatting.html

实现格式化的流对象是 PrintWriter ,字符流类或 PrintStream (字节流类)的实例。


Note: The only PrintStream objects you are likely to need are System.out and System.err. (See I/O from the Command Line for more on these objects.) When you need to create a formatted output stream, instantiate PrintWriter, not PrintStream.


与所有字节和字符流对象一样,PrintStreamPrintWriter的实例实现了一组标准的write方法,用于简单的字节和字符输出。此外,PrintStreamPrintWriter都实现了将内部数据转换为格式化输出的同一组方法。提供两个级别的格式:

  • printprintln以标准方式格式化各个值。
  • format基于格式字符串格式化几乎任意数量的值,具有许多用于精确格式化的选项。

printprintln方法

使用适当的toString方法转换值后,调用printprintln输出单个值。我们可以在 Root 示例中看到这一点:

  1. public class Root {
  2. public static void main(String[] args) {
  3. int i = 2;
  4. double r = Math.sqrt(i);
  5. System.out.print("The square root of ");
  6. System.out.print(i);
  7. System.out.print(" is ");
  8. System.out.print(r);
  9. System.out.println(".");
  10. i = 5;
  11. r = Math.sqrt(i);
  12. System.out.println("The square root of " + i + " is " + r + ".");
  13. }
  14. }

这是Root的输出:

  1. The square root of 2 is 1.4142135623730951.
  2. The square root of 5 is 2.23606797749979.

ir变量被格式化两次:第一次在print的重载中使用代码,第二次由 Java 编译器自动生成的转换代码,也使用toString。您可以通过这种方式格式化任何值,但是您无法控制结果。

format方法

format方法基于格式字符串格式化多个参数。格式字符串由嵌入格式说明符的静态文本组成;除格式说明符外,格式字符串输出不变。

格式字符串支持许多功能。在本教程中,我们将介绍一些基础知识。有关完整说明,请参阅 API 规范中的 format string syntax

Root2 示例使用单个format调用格式化两个值:

  1. public class Root2 {
  2. public static void main(String[] args) {
  3. int i = 2;
  4. double r = Math.sqrt(i);
  5. System.out.format("The square root of %d is %f.%n", i, r);
  6. }
  7. }

这是输出:

  1. The square root of 2 is 1.414214.

与本例中使用的三个一样,所有格式说明符都以%开头,以 1 或 2 字符转换结束,指定生成的格式化输出的种类。这里使用的三个转换是:

  • d将整数值格式化为十进制值。
  • f将浮点值格式化为十进制值。
  • n输出特定于平台的线路终结器。

以下是其他一些转换:

  • x将整数格式化为十六进制值。
  • s将任何值格式化为字符串。
  • tB将整数格式化为特定于语言环境的月份名称。

还有很多其他转换。


Note:

%%%n外,所有格式说明符必须与参数匹配。如果他们不这样做,则会抛出异常。

在 Java 编程语言中,\n转义始终生成换行符(\u000A)。除非您特别需要换行符,否则请勿使用\n。要获取本地平台的正确行分隔符,请使用%n


除了转换之外,格式说明符还可以包含几个其他元素,以进一步自定义格式化输出。这是一个例子, Format ,它使用了所有可能的元素。

  1. public class Format {
  2. public static void main(String[] args) {
  3. System.out.format("%f, %1$+020.10f %n", Math.PI);
  4. }
  5. }

这是输出:

  1. 3.141593, +00000003.1415926536

附加元素都是可选的。下图显示了较长的说明符如何分解为元素。

Elements of a format specifier

格式说明符的元素。

元素必须按所示顺序出现。从右侧开始,可选元素是:

  • 精度。对于浮点值,这是格式化值的数学精度。对于s和其他常规转换,这是格式化值的最大宽度;如有必要,该值将被截断。
  • 宽度。格式化值的最小宽度;必要时填充该值。默认情况下,该值使用空白填充。
  • 标志指定其他格式选项。在Format示例中,+标志指定应始终使用符号格式化数字,0标志指定0是填充字符。其他标志包括-(右侧的 pad)和,(具有特定于语言环境的千位分隔符的格式号)。请注意,某些标志不能与某些其他标志一起使用或与某些转换一起使用。
  • 参数索引允许您显式匹配指定的参数。您还可以指定<以匹配与前一个说明符相同的参数。因此,这个例子可以说:System.out.format("%f, %&lt;+020.10f %n", Math.PI);