Java中的格式化输出主要用于将数据以特定的格式输出到控制台或文件中。这种输出方式可以让输出的数据更易于阅读和理解,并且可以按照规定的格式进行对齐和排列。

使用格式化输出可以控制输出的字符串的长度、精度、对齐方式等,可以输出带有特定格式的日期、时间和数字。这对于生成报表、日志、表格等结构化的输出非常有用,也能提供更好的用户体验。

String.format 方法

String.format 方法可以用于创建格式化的字符串,它的用法如下:

1
String formattedString = String.format(format, args);

其中,format 是格式化字符串,用于指定输出的格式;args 是要插入到格式化字符串中的参数。格式化字符串可以包含转换说明符(conversion specifiers)、标志(flags)、宽度(width)、精度(precision)等,用于指定输出的格式。例如:

1
2
String formattedString = String.format("Hello, %s! Today is %tF", "Alice", new Date());
System.out.println(formattedString);

在这个例子中,%s 用于替换字符串,%tF 用于替换日期,%tF 是日期格式化的一种方式。

System.out.printf 方法

System.out.printf 方法可以用于格式化输出到标准输出流,它的用法如下:

1
System.out.printf(format, args);

String.format 方法类似,format 是格式化字符串,args 是要插入到格式化字符串中的参数。例如:

1
2
3
String name = "Bob";
int age = 30;
System.out.printf("Name: %s, Age: %d", name, age);

在这个例子中,%s 用于替换字符串,%d 用于替换整数。

转换符

转换符 描述
%d 整数型
%f 浮点型
%c 字符型
%s 字符串
%b 布尔型
%x 十六进制
%o 八进制
%e 科学计数法
%tA 完整星期名称
%ta 缩写星期名称
%tB 完整月份名称
%tb 缩写月份名称
%tY 4 位年份
%ty 2 位年份
%tm 2 位月份
%td 2 位日
%tH 24 小时格式的小时
%tI 12 小时格式的小时
%tM 2 位分钟
%tS 2 位秒数
%tp 上午或下午

标志符

标识符 说明
- 结果将是左对齐的。默认情况下,结果将是右对齐的。
+ 结果将包括一个加号(+)对于正数或一个减号(-)对于负数。默认情况下,只有负数前面才会添加减号。
0 结果将用零来填充,而不是空格。默认情况下,结果将使用空格来填充。
, 用作分组分隔符。例如,12345 可以用 , 标识符来格式化为 12,345
( 结果将在负数前面加上括号。例如,-10 可以被格式化为 (10)
# 根据不同的转换类型,对结果加上特定的标记。例如,在十六进制数中使用 # 可以表示加上 0x 前缀,对于浮点数则表示包括小数点。
<空格> 结果将包括一个前导的空格(对于正数),而不是加号。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// 格式化字符串输出
String name = "Alice";
String formattedString = String.format("Hello, %s!", name);
System.out.println(formattedString); // 输出:Hello, Alice!

// 格式化浮点数输出
double number = 123.456;
String formattedNumber = String.format("The number is: %f", number);
System.out.println(formattedNumber); // 输出:The number is: 123.456000

// 使用标志符进行浮点数格式化输出
double number1 = 123.456;
// 格式化输出一个浮点数,带正负号,总宽度为10如果不足则在左侧使用空格进行填充,保留小数点后两位。
String formattedNumber1 = String.format("The number is: %+10.2f", number1);
System.out.println(formattedNumber1); // 输出:The number is: +123.46

// 格式化时间输出
Date now = new Date();
String formattedTime = String.format("Current time: %tF %tT", now, now);
System.out.println(formattedTime); // 输出:Current time: 2024-01-15 14:30:00

// 使用标志符进行时间格式化输出
Date now1 = new Date();
// <:表示在当前位置使用前面给出的参数列表中的参数,避免重复指定参数。
String formattedTime1 = String.format("Current time: %tA, %<tB %<td, %<tY", now1);
System.out.println(formattedTime1); // 输出:Current time: Sunday, January 15, 2024

// 使用标志符控制对齐方式和最小宽度
int number1 = 123;
int number2 = 456;
System.out.printf("Left aligned: %-10d, Right aligned: %10d%n", number1, number2);
// 输出:Left aligned: 123 , Right aligned: 456

// 使用标志符控制数值的显示格式
double value = 12345.6789;
System.out.printf("Scientific notation: %e, Currency: %.2f%n", value, value);
// 输出:Scientific notation: 1.234568e+04, Currency: 12345.68

// 使用标志符控制日期时间的显示格式
Date now = new Date();
System.out.printf("24-hour time: %tT, 12-hour time: %tr%n", now, now);
// 输出:24-hour time: 14:30:00, 12-hour time: 02:30:00 PM