Java 提供了多种格式化输出的方式,主要通过 String.format()
、System.out.printf()
和 Formatter
类来实现。常见的格式化操作包括数字、日期、字符串等。
一、 格式化输出方法
1. 使用 String.format() 方法
String.format()
方法返回一个格式化后的字符串,而不直接打印输出。你可以将其存储到变量中或用于其他处理。
语法:
String.format(format, arguments);
format
是格式化字符串,包含格式说明符。arguments
是要格式化的参数。
示例:
int age = 25;
String formattedString = String.format("My age is %d", age);
System.out.println(formattedString); // 输出:My age is 25
2. 使用 System.out.printf() 方法
System.out.printf()
方法直接将格式化的输出打印到控制台,类似于 printf
函数在 C 语言中的功能。
语法:
System.out.printf(format, arguments);
示例:
int age = 25;
System.out.printf("My age is %d\n", age); // 输出:My age is 25
3. 使用 Formatter
类
Formatter
类提供了更多的格式化功能,允许你创建格式化的输出流,并将其写入到 StringBuilder
、PrintWriter
等对象中。
示例:
import java.util.Formatter; // 导入 java.util.Formatter 类,用于格式化字符串
public class FormatterExample { // 定义一个名为 FormatterExample 的类
public static void main(String[] args) { // 主方法,程序的入口点
Formatter formatter = new Formatter(); // 创建一个 Formatter 对象,用于格式化字符串
formatter.format("My age is %d", 25); // 使用 format 方法格式化字符串
// "My age is %d" 是格式化模板,%d 是占位符,表示一个整数
// 25 是传递给占位符 %d 的实际值
System.out.println(formatter); // 输出格式化后的字符串到控制台
formatter.close(); // 关闭 Formatter 对象,释放资源
}
}
代码分析:
Formatter
类:
用于格式化字符串。它类似于String.format()
方法,但提供了更灵活的格式化方式。format
方法:
接受一个格式化模板和一组参数。模板中的%d
是一个占位符,表示一个整数。System.out.println(formatter)
:Formatter
对象在调用toString()
方法时会返回其内部的格式化字符串。formatter.close()
:
关闭Formatter
对象,释放与之相关的资源。这是良好的编程习惯,尤其是在处理 I/O 资源时。
运行这段代码后,控制台会输出:
My age is 25
二、 常见的格式说明符:
1. 整数类型格式化说明符
%d
: 十进制整数。- 用于格式化整数(例如:
123
)。 - 示例:
System.out.printf("%d\n", 123);
输出:123
- 用于格式化整数(例如:
%o
: 八进制整数。- 用于输出整数的八进制表示。
- 示例:
System.out.printf("%o\n", 8);
输出:10
%x
: 十六进制整数(小写字母)。- 用于输出整数的十六进制表示(小写字母)。
- 示例:
System.out.printf("%x\n", 255);
输出:ff
%X
: 十六进制整数(大写字母)。- 用于输出整数的十六进制表示(大写字母)。
- 示例:
System.out.printf("%X\n", 255);
输出:FF
%c
: 单个字符。- 用于格式化单个字符。
- 示例:
System.out.printf("%c\n", 'A');
输出:A
2. 浮点类型格式化说明符
%f
: 浮点数。- 默认输出浮点数,小数点后有六位。
- 示例:
System.out.printf("%f\n", 123.456);
输出:123.456000
%.nf
: 浮点数(保留 n 位小数)。- 用于格式化浮点数并指定保留的小数位数。
- 示例:
System.out.printf("%.2f\n", 123.456);
输出:123.46
%e
: 科学计数法(小写字母)。- 用于格式化浮点数为科学计数法表示(小写字母)。
- 示例:
System.out.printf("%e\n", 1234567.89);
输出:1.234568e+06
%E
: 科学计数法(大写字母)。- 用于格式化浮点数为科学计数法表示(大写字母)。
- 示例:
System.out.printf("%E\n", 1234567.89);
输出:1.234568E+06
%g
: 自动选择浮动或科学计数法(小写字母)。- 根据数字的大小自动选择浮动或科学计数法。
- 示例:
System.out.printf("%g\n", 1234567.89);
输出:1234567.89
%G
: 自动选择浮动或科学计数法(大写字母)。- 根据数字的大小自动选择浮动或科学计数法(大写字母)。
- 示例:
System.out.printf("%G\n", 1234567.89);
输出:1234567.89
3. 字符串格式化说明符
%s
: 字符串。- 用于格式化字符串。
- 示例:
System.out.printf("%s\n", "Hello, World!");
输出:Hello, World!
4. 日期和时间格式化说明符
日期和时间的格式化说明符以 %t
开头,后跟日期/时间的特定类型。
%tY
: 年份(四位数字)。- 示例:
System.out.printf("%tY\n", new Date());
输出:2025
- 示例:
%tm
: 月份(数字表示,01 到 12)。- 示例:
System.out.printf("%tm\n", new Date());
输出:01
- 示例:
%td
: 日期(数字表示,01 到 31)。- 示例:
System.out.printf("%td\n", new Date());
输出:21
- 示例:
%tB
: 月份(完整的英文名称)。- 示例:
System.out.printf("%tB\n", new Date());
输出:January
- 示例:
%tD
: 日期(MM/DD/YY 格式)。- 示例:
System.out.printf("%tD\n", new Date());
输出:01/21/25
- 示例:
%tH
: 小时(24小时制,00 到 23)。- 示例:
System.out.printf("%tH\n", new Date());
输出:14
- 示例:
%tM
: 分钟(00 到 59)。- 示例:
System.out.printf("%tM\n", new Date());
输出:30
- 示例:
%tS
: 秒(00 到 59)。- 示例:
System.out.printf("%tS\n", new Date());
输出:45
- 示例:
%tT
: 时间(HH:MM:SS 格式)。- 示例:
System.out.printf("%tT\n", new Date());
输出:14:30:45
- 示例:
%tF
: 完整的日期(YYYY-MM-DD 格式)。- 示例:
System.out.printf("%tF\n", new Date());
输出:2025-01-21
- 示例:
5. 百分号格式化说明符
%%
: 输出一个百分号。- 示例:
System.out.printf("100%%\n");
输出:100%
- 示例:
6. 其他格式化控制符
%n
: 换行符(平台独立的换行符)。- 示例:
System.out.printf("Hello%nWorld%n");
输出:Hello
(换行)World
(换行)
- 示例:
%b
: 布尔类型。- 示例:
System.out.printf("%b\n", true);
输出:true
- 示例:
三、 常用的格式化选项:
1. 宽度(Width)
宽度选项用于控制输出数据的最小字符宽度。如果格式化的内容小于指定宽度,Java 会根据其他选项(如填充符)来填充剩余的空间。
语法:
%[width]specifier
- width:指定最小的输出宽度。
- specifier:格式化说明符(如
%d
、%f
、%s
等)。
示例:
System.out.printf("|%10d|\n", 123); // 输出:| 123|
System.out.printf("|%-10d|\n", 123); // 输出:|123 |
|%10d|
:输出宽度为 10,如果数字少于 10 个字符宽度,前面会用空格填充。|%-10d|
:输出宽度为 10,左对齐,后面用空格填充。
2. 精度(Precision)
精度用于控制浮点数的小数位数以及字符串的最大长度。
2.1. 浮点数的精度:
对于浮点数,可以指定小数点后保留的位数。
语法:
%.[precision]f
- precision:指定浮点数小数点后的位数。
示例:
System.out.printf("%.2f\n", 123.456); // 输出:123.46
System.out.printf("%.3f\n", 123.456); // 输出:123.456
%.2f
:保留 2 位小数。%.3f
:保留 3 位小数。
2.2. 字符串的精度:
对于字符串,可以指定输出字符串的最大字符数。
示例:
System.out.printf("%.5s\n", "HelloWorld"); // 输出:Hello
%.5s
:输出字符串的前 5 个字符。
3. 填充符(Padding Character)
填充符用于控制当数据不够宽度时,用指定的字符填充空白位置。默认情况下,Java 会使用空格填充,但我们可以指定其他字符(如 0
)作为填充符。
语法:
%[fill_char][width]specifier
- fill_char:填充字符。
- width:最小输出宽度。
- specifier:格式化说明符。
示例:
System.out.printf("|%010d|\n", 123); // 输出:|0000000123|
System.out.printf("|%-10d|\n", 123); // 输出:|123 |
|%010d|
:指定宽度为 10,前面用0
填充。|%-10d|
:指定宽度为 10,左对齐,后面用空格填充。
4. 对齐(Alignment)
默认情况下,数字和字符串都会右对齐。但可以通过指定符号来改变对齐方式。
-
:左对齐。- 默认为右对齐。
示例:
System.out.printf("|%-10d|\n", 123); // 输出:|123 | 左对齐
System.out.printf("|%10d|\n", 123); // 输出:| 123| 右对齐(默认)
%-10d
:左对齐,输出的宽度为 10。%10d
:右对齐,输出的宽度为 10。
5. 百分号(%%)
如果我们需要输出一个实际的百分号字符,可以使用 %%
。
示例:
System.out.printf("The success rate is 100%%.\n"); // 输出:The success rate is 100%.
6. 日期和时间格式化(Date/Time Format)
日期和时间的格式化支持类似宽度、精度等选项。我们可以控制日期/时间输出的宽度和填充方式。
示例:
System.out.printf("%tY-%tm-%td\n", new Date()); // 输出:2025-01-21(日期格式:YYYY-MM-DD)
7. 宽度和精度的组合使用
我们可以组合使用宽度和精度来进一步控制输出格式。例如,控制浮点数的总宽度以及小数点后位数。
示例:
System.out.printf("|%10.2f|\n", 123.456); // 输出:| 123.46|
|%10.2f|
:总宽度为 10,其中小数点后保留 2 位。
8. 自动选择浮动或科学计数法(%g 和 %G)
%g
:自动选择使用浮动(普通表示法)或科学计数法(小写字母)。%G
:自动选择使用浮动(普通表示法)或科学计数法(大写字母)。
示例:
System.out.printf("%g\n", 1234567.89); // 输出:1234567.89
System.out.printf("%g\n", 0.000123456); // 输出:1.23456e-04
System.out.printf("%G\n", 1234567.89); // 输出:1234567.89
System.out.printf("%G\n", 0.000123456); // 输出:1.23456E-04
9. 对齐与填充符结合
填充符与对齐选项结合使用时,可以非常精细地控制输出的格式,常用于表格输出等。
示例:
System.out.printf("|%0-10d|\n", 123); // 输出:|123 | 左对齐并用0填充
//然而,0 和 - 是互斥的,因为 - 表示左对齐,而 0 表示用 0 填充空白部分。
//当它们同时出现时,0 的行为会被忽略,只有 - 生效。
System.out.printf("|%0+10d|\n", 123); // 输出:|+0000123| 右对齐并用0填充,带符号
四、 格式化日期:
Java 中的日期格式化通常依赖于 java.text.SimpleDateFormat
类来实现,但如果使用 String.format()
或 System.out.printf()
,日期格式化通过 t
系列的格式化说明符进行。
1. %t 系列格式化说明符
日期和时间的格式化说明符以 %t
开头,并跟随一个字母,表示不同的日期和时间部分。常用的日期格式化说明符如下(前文有详细描述):
日期部分:
%tY
:年份(四位数字,例如2025
)。%tm
:月份(两位数字,例如01
,12
)。%td
:日期(两位数字,例如01
,31
)。%tB
:完整的月份名称(例如January
,December
)。%tD
:日期(MM/DD/YY 格式,例如01/21/25
)。
时间部分:
%tH
:小时(24小时制,00 到 23)。%tM
:分钟(00 到 59)。%tS
:秒钟(00 到 59)。%tI
:小时(12小时制,01 到 12)。%tp
:AM/PM(上午/下午)。%tT
:时间(HH:MM:SS 格式,例如14:30:45
)。
完整的日期和时间格式:
%tF
:完整日期(YYYY-MM-DD 格式,例如2025-01-21
)。%tR
:时间(HH:MM 格式,例如14:30
)。
2. 日期格式化示例
示例 1:格式化完整日期(YYYY-MM-DD)
import java.util.Date; // 导入 java.util.Date 类,用于表示日期和时间
public class DateFormatExample { // 定义一个名为 DateFormatExample 的类
public static void main(String[] args) { // 主方法,程序的入口点
Date date = new Date(); // 创建一个 Date 对象,表示当前日期和时间
System.out.printf("Formatted date: %tF\n", date); // 输出:2025-01-21
// 使用 printf 方法格式化日期
// %tF 是一个格式化占位符,表示按照 ISO 8601 格式(yyyy-MM-dd)输出日期
// date 是传递给占位符的实际日期对象
// 输出结果为:Formatted date: 2025-01-21(假设当前日期是 2025 年 1 月 21 日)
}
}
%tF
输出完整的日期,格式为YYYY-MM-DD
。
示例 2:格式化时间(HH:MM:SS)
import java.util.Date; // 导入 java.util.Date 类,用于表示当前日期和时间
public class DateFormatExample { // 定义一个名为 DateFormatExample 的类
public static void main(String[] args) { // 主方法,程序的入口点
Date date = new Date(); // 创建一个 Date 对象,表示当前日期和时间
System.out.printf("Formatted time: %tT\n", date); // 输出:14:30:45
// 使用 printf 方法格式化时间
// %tT 是一个格式化占位符,表示按照 24 小时制格式(HH:mm:ss)输出时间
// date 是传递给占位符的实际日期对象
// 输出结果为:Formatted time: 14:30:45(假设当前时间是 14:30:45)
}
}
%tT
输出时间,格式为HH:MM:SS
。
示例 3:格式化为月份名称和日期(Month Day, Year)
import java.util.Date; // 导入 java.util.Date 类,用于表示日期和时间
public class DateFormatExample { // 定义一个名为 DateFormatExample 的类
public static void main(String[] args) { // 主方法,程序的入口点
Date date = new Date(); // 创建一个 Date 对象,表示当前日期和时间
System.out.printf("Formatted date with month name: %tB %td, %tY\n", date, date, date); // 输出:January 21, 2025
// 使用 printf 方法格式化日期,并在输出中包含月份名称
// %tB:格式化为月份的完整名称(例如 January、February 等)
// %td:格式化为日期的天数部分(例如 01 到 31)
// %tY:格式化为四位年份(例如 2025)
// date 是传递给占位符的实际日期对象,这里重复传递了三次 date,分别对应 %tB、%td 和 %tY
// 输出结果为:Formatted date with month name: January 21, 2025(假设当前日期是 2025 年 1 月 21 日)
}
}
%tB
输出完整的月份名称,%td
输出日期,%tY
输出年份。
示例 4:格式化为12小时制(AM/PM)
import java.util.Date; // 导入 java.util.Date 类,用于表示日期和时间
public class DateFormatExample { // 定义一个名为 DateFormatExample 的类
public static void main(String[] args) { // 主方法,程序的入口点
Date date = new Date(); // 创建一个 Date 对象,表示当前日期和时间
System.out.printf("Formatted time in 12-hour format: %tI:%tM %tp\n", date, date, date); // 输出:02:30 PM
// 使用 printf 方法格式化时间,以 12 小时制格式输出
// %tI:格式化为 12 小时制的小时部分(01 到 12)
// %tM:格式化为分钟部分(00 到 59)
// %tp:格式化为 AM 或 PM
// date 是传递给占位符的实际日期对象,这里重复传递了三次 date,分别对应 %tI、%tM 和 %tp
// 输出结果为:Formatted time in 12-hour format: 02:30 PM(假设当前时间是 14:30)
}
}
%tI
输出 12 小时制的小时数,%tM
输出分钟,%tp
输出 AM/PM。
3. 格式化日期和时间的组合
我们也可以将日期和时间格式化说明符组合在一起,以显示完整的日期和时间。
示例:日期和时间的完整格式(YYYY-MM-DD HH:MM:SS)
import java.util.Date;
public class DateFormatExample {
public static void main(String[] args) {
Date date = new Date();
System.out.printf("Formatted date and time: %tF %tT\n", date, date); // 输出:2025-01-21 14:30:45
}
}
%tF
用于格式化日期部分(YYYY-MM-DD)。%tT
用于格式化时间部分(HH:MM:SS)。
4. 控制输出宽度和填充
当然,和其他格式化类型一样,我们也可以控制日期和时间输出的宽度以及如何填充空白。通过指定宽度,可以保证输出符合要求的格式。
示例:控制日期宽度
import java.util.Date; // 导入 java.util.Date 类,用于表示日期和时间
public class DateFormatExample { // 定义一个名为 DateFormatExample 的类
public static void main(String[] args) { // 主方法,程序的入口点
Date date = new Date(); // 创建一个 Date 对象,表示当前日期和时间
System.out.printf("|%20tF|\n", date); // 使用 printf 方法格式化日期并输出
// %tF:格式化日期为 ISO 8601 格式,即 yyyy-MM-dd(例如 2025-01-21)
// 20:指定字段宽度为 20 个字符
// 默认情况下,字符串会右对齐,因此左侧会填充空格以达到指定的宽度
// 输出结果为:| 2025-01-21|(假设当前日期是 2025-01-21)
}
}
%20tF
表示宽度为 20,并且不足部分将会填充空格。
示例:控制时间宽度和填充
import java.util.Date; // 导入 java.util.Date 类,用于表示日期和时间
public class DateFormatExample { // 定义一个名为 DateFormatExample 的类
public static void main(String[] args) { // 主方法,程序的入口点
Date date = new Date(); // 创建一个 Date 对象,表示当前日期和时间
System.out.printf("|%10tT|\n", date); // 使用 printf 方法格式化时间并输出
// %tT:格式化时间为 24 小时制格式,即 HH:mm:ss(例如 14:30:45)
// 10:指定字段宽度为 10 个字符
// 默认情况下,字符串会右对齐,因此如果格式化后的时间字符串长度小于 10 个字符,
// 左侧会填充空格以达到指定的宽度
// 输出结果为:|14:30:45 |(假设当前时间是 14:30:45)
}
}
%10tT
指定时间的宽度为 10,左侧填充空格。- 如果需要左对齐,可以在格式化占位符中添加
-
符号,例如:%-10tT
。这样,空格会填充在右侧。
5. 日期格式化与 SimpleDateFormat 类结合使用
String.format()
和 System.out.printf()
适用于简单的日期格式化,但如果需要更复杂的格式化(例如自定义格式),可以使用 SimpleDateFormat
类。
示例:自定义日期格式化(使用 SimpleDateFormat)
import java.text.SimpleDateFormat; // 导入 SimpleDateFormat 类,用于自定义日期和时间的格式化
import java.util.Date; // 导入 Date 类,用于表示日期和时间
public class SimpleDateFormatExample { // 定义一个名为 SimpleDateFormatExample 的类
public static void main(String[] args) { // 主方法,程序的入口点
Date date = new Date(); // 创建一个 Date 对象,表示当前日期和时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
// 创建一个 SimpleDateFormat 对象,用于自定义日期和时间的格式化
// "yyyy/MM/dd HH:mm:ss" 是格式化模板:
// yyyy:四位年份
// MM:两位月份
// dd:两位日期
// HH:两位24小时制的小时
// mm:两位分钟
// ss:两位秒数
String formattedDate = sdf.format(date);
// 使用 format 方法将 Date 对象格式化为指定的字符串格式
System.out.println("Formatted date and time: " + formattedDate);
// 输出格式化后的日期和时间
// 例如:Formatted date and time: 2025/01/21 14:30:45(假设当前时间是 2025 年 1 月 21 日 14:30:45)
}
}
SimpleDateFormat
允许你创建一个自定义的日期格式,例如"yyyy/MM/dd HH:mm:ss"
。SimpleDateFormat
是线程不安全的,因此在多线程环境中使用时需要特别注意。- 如果需要线程安全的日期格式化工具,可以使用
java.time.format.DateTimeFormatter
(Java 8 及以上版本)。
总结
String.format()
返回格式化后的字符串。System.out.printf()
直接输出格式化字符串到控制台。Formatter
提供了更多的控制,可以用于自定义输出流。
评论留言
欢迎您,!您可以在这里畅言您的的观点与见解!