格式化输出

-- 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-23
k小时,0-23
I小时,01-12
l小时,1-12
M分钟,00-59
S秒,00-60
L毫秒,000-999
N纳秒,000000000 - 999999999
P本地敏感, PM or AM
p本地敏感,pm or am
z时区偏移量, 如 +0800
Z时区
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-366
m月, 01-13
d日,01-31
e日,1-31
R24小时时间,如 18:05
T24小时时间,如 18:05:19
r12小时时间, 如 06:05:19 pm
D美国格式的日期(月/日/年),如 02/09/2004
FISO 8601 日期, 如 2004-02-09
c完整的日期和时间,如 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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值