格式化输出

来源:互联网 发布:我打打单软件 编辑:程序博客网 时间:2024/05/29 13:05

-- Start

在 JDK 5.0 之前,我们使用NumberFormat 类来格式化数字和货币,使用 DateFormat 类来格式化日期和时间,使用MessageFormat 类来格式化消息。从 JDK 5.0 开始,我们又多了一种选择,我们可以像使用 C 语言的 printf 函数一样使用 System.out.printf 方法,不过要比 C 语言的 printf 函数更强大,因为 Java 的 printf 方法还提供了本地化的支持。

下面我们来看一个简单的例子.

System.out.printf("格式化数字例子:%1$,30.6f", 9876543210.0123456789);
结果如下:

格式化数字例子:          9,876,543,210.012346
%1$,30.6f 被称为格式符(format specifier), 格式符由以下几部分组成:
%[argument_index$][flags][width][.precision]conversion%              1$      ,      30 .6         f

  • %是必须的, 任何格式符都由百分号开始.
  • argument_index是可选的, 它表示 printf 方法参数的索引, 第一个参数是1$, 第二个是2$,...
  • flags是可选的, flags 依赖于 conversion, 详见下表.
  • width是可选的, 表示输出数字的宽度.
  • precision可选的, 表示小数位数.
  • conversion是必须的, 表示如何格式化参数, 详见下表.

Java 支持如下转换符(conversion).

转换符(Conversion)参数类型(Argument Category)描述(Description)b/B任意类型默认结果为 true
如果参数是 null, 结果为 false
如果参数是布尔型, 结果是 String.valueOf(arg)h/H任意类型如果参数是 null, 结果为 null,
否则为Integer.toHexString(arg.hashCode())s/S任意类型如果参数是 null, 结果为 null,
如果参数实现了 Formattable, 结果为 arg.formatTo,
否则结果为 arg.toString()c/CcharUnicode 字符d整数整数o整数八进制整数x/X整数十六进制整数e/E浮点数科学记数法f浮点数浮点数g/G浮点数浮点数或科学记数法取决于小数位数a/A浮点数十六进制浮点数t/T日期和时间格式化日期和时间的前缀,后缀见下表%百分号%n换行符与平台相关的换行符

日期和时间转换符(后缀)

转换符(Conversion)描述(Description)H小时,00-23k小时,0-23I小时,01-12l小时,1-12M分钟,00-59S秒,00-60L毫秒,000-999N纳秒,000000000 - 999999999P本地敏感, PM or AMp本地敏感,pm or amz时区偏移量, 如 +0800Z时区s从格林威治时间1970-01-01 00:00:00起的秒数Q从格林威治时间1970-01-01 00:00:00起的毫秒数B本地敏感,月的完整拼写b/h本地敏感,月的缩写A本地敏感,星期的完整拼写a本地敏感,星期的缩写Y4位数字的年(前面补0)y年的后两位数字(前面补0)C年的前两位数字(前面补0)j一年的第几天,001-366m月, 01-13d日,01-31e日,1-31R24小时时间,如 18:05T24小时时间,如 18:05:19r12小时时间, 如 06:05:19 pmD美国格式的日期(月/日/年),如 02/09/2004FISO 8601 日期, 如 2004-02-09c完整的日期和时间,如 Mon Feb 09 18:05:19 PST 2004

Java 支持如下标志(flag)

标志描述举例-左对齐|3333.33 |#(对于f格式)包含小数点3333.#(对于x或0格式)添加前缀0x或00xcafe+打印正数数和负数的符号+3333.33空格在正数之前添加空格| 3333.33|0数字前面补0003333.33,本地敏感,添加千分位3,333.33(将负数括在括号内(3333.33)

下面是一个简单的例子.

public static void main(String[] args) {Calendar c = Calendar.getInstance();System.out.println("格式化整数");System.out.printf(Locale.CHINA, "中国: %,d%n", 987654321);System.out.printf(Locale.GERMAN, "德国: %,d%n", 987654321);System.out.println("\n\n格式化浮点数");System.out.printf(Locale.CHINA, "中国: %,.2f%n", 987654321.123456789);System.out.printf(Locale.GERMAN, "德国: %,.2f%n", 987654321.123456789);System.out.println("\n\n格式化日期和时间");System.out.printf(Locale.CHINA, "中国: %tc%n", c);System.out.printf(Locale.GERMAN, "德国: %tc%n", c);System.out.printf(Locale.CHINA, "中国: %tF%n", c);System.out.printf(Locale.GERMAN, "德国: %tF%n", c);System.out.printf(Locale.CHINA, "中国: %1$tY/%1$tm/%1$td%n", c);System.out.printf(Locale.GERMAN, "德国: %1$tY/%1$tm/%1$td%n", c);System.out.println("\n\n格式化消息");System.out.printf("你好,%n我叫 %1$s.%n我的生日是 %2$tF.%n", "尚波", c);}

结果如下:

格式化整数中国: 987,654,321德国: 987.654.321格式化浮点数中国: 987,654,321.12德国: 987.654.321,12格式化日期和时间中国: 星期一 五月 21 17:05:47 GMT+08:00 2012德国: Mo Mai 21 17:05:47 GMT+08:00 2012中国: 2012-05-21德国: 2012-05-21中国: 2012/05/21德国: 2012/05/21格式化消息你好,我叫 尚波.我的生日是 2012-05-21.
从中我们可以看到, 有部分转换符是本地敏感的, 如: 星期名, 月份名, 千分位等.

上面的例子中, 我们将格式化的结果输出到标准输出流, 我们还可以

  • 使用 System.err.printf(), 将格式化的结果输出到标准错误输出流.
  • 使用 String.format(), 将格式化的结果保存到一个String变量中.
  • 使用 Formatter类, 我们可以将格式化的结果输出到文件, 输出流等, 或添加到 StringBuilder, StringBuffer等.

---更多参见:Java 精萃
-- 声 明:转载请注明出处
-- Last Updated on 2012-05-21
-- Written by ShangBo on 2012-04-26
-- End


原创粉丝点击