本文共 3394 字,大约阅读时间需要 11 分钟。
-- 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
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/C | char | Unicode 字符 |
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 | 本地敏感,星期的缩写 |
Y | 4位数字的年(前面补0) |
y | 年的后两位数字(前面补0) |
C | 年的前两位数字(前面补0) |
j | 一年的第几天,001-366 |
m | 月, 01-13 |
d | 日,01-31 |
e | 日,1-31 |
R | 24小时时间,如 18:05 |
T | 24小时时间,如 18:05:19 |
r | 12小时时间, 如 06:05:19 pm |
D | 美国格式的日期(月/日/年),如 02/09/2004 |
F | ISO 8601 日期, 如 2004-02-09 |
c | 完整的日期和时间,如 Mon Feb 09 18:05:19 PST 2004 |
Java 支持如下标志(flag)
标志 | 描述 | 举例 |
- | 左对齐 | |3333.33 | |
#(对于f格式) | 包含小数点 | 3333. |
#(对于x或0格式) | 添加前缀0x或0 | 0xcafe |
+ | 打印正数数和负数的符号 | +3333.33 |
空格 | 在正数之前添加空格 | | 3333.33| |
0 | 数字前面补0 | 003333.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.从中我们可以看到, 有部分转换符是本地敏感的, 如: 星期名, 月份名, 千分位等.
上面的例子中, 我们将格式化的结果输出到标准输出流, 我们还可以
---更多参见:
-- 声 明:转载请注明出处 -- Last Updated on 2012-05-21 -- Written by ShangBo on 2012-04-26 -- End