Formatting

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

Note:

您可能唯一需要的PrintStream个对象是System.outSystem.err。 (有关这些对象的更多信息,请参见命令行中的 I/O。)当需要创建格式化的输出流时,请实例化PrintWriter而不是PrintStream

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

  • printprintln以标准方式格式化各个值。

  • format根据格式字符串 对几乎所有数量的值进行格式化,并提供许多用于精确格式化的选项。

打印和打印方法

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

public class Root {
    public static void main(String[] args) {
        int i = 2;
        double r = Math.sqrt(i);
        
        System.out.print("The square root of ");
        System.out.print(i);
        System.out.print(" is ");
        System.out.print(r);
        System.out.println(".");

        i = 5;
        r = Math.sqrt(i);
        System.out.println("The square root of " + i + " is " + r + ".");
    }
}

这是Root的输出:

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

ir变量被格式化两次:第一次使用过载print的代码,第二次使用 Java 编译器自动生成的转换代码,该转换代码也使用toString。您可以通过这种方式设置任何值的格式,但是您对结果没有太多控制权。

格式方法

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

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

Root2示例通过一次format调用来格式化两个值:

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

这是输出:

The square root of 2 is 1.414214.

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

  • d将整数值格式化为十进制值。

  • f将浮点值格式设置为十进制值。

  • n输出平台特定的行终止符。

以下是一些其他转换:

  • x将整数格式化为十六进制值。

  • s将任何值格式化为字符串。

  • tB将整数格式设置为特定于语言环境的月份名称。

还有许多其他转换。

Note:

除了%%%n,所有格式说明符都必须与参数匹配。如果没有,则抛出异常。

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

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

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

这是输出:

3.141593, +00000003.1415926536

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

格式说明符的元素

格式说明符的元素。

元素必须按照显示的 Sequences 出现。从右侧开始,可选元素为:

  • 精度 。对于浮点值,这是格式化值的 math 精度。对于s和其他常规转换,这是格式化值的最大宽度;如果需要,该值将被右截断。

  • 宽度 。格式化值的最小宽度;如果需要,将填充该值。默认情况下,该值用空格左填充。

  • 标记 指定其他格式选项。在Format示例中,+标志指定数字应始终以符号格式化,而0标志指定0为填充字符。其他标志包括-(位于右侧的键盘)和,(具有特定于语言环境的千位分隔符的格式编号)。请注意,某些标志不能与某些其他标志或某些转换一起使用。

  • Argument Index 允许您显式匹配指定的参数。您还可以指定<来匹配与前一个说明符相同的参数。因此该示例可能会说:System.out.format("%f, %<+020.10f %n", Math.PI);