一篇文章大家徹底學(xué)會Java之格式化輸出
前言
Java 提供了多種格式化輸出的方式,主要通過 String.format()、System.out.printf() 和 Formatter 類來實現(xiàn)。常見的格式化操作包括數(shù)字、日期、字符串等。
一、 格式化輸出方法
1. 使用 String.format() 方法
String.format() 方法返回一個格式化后的字符串,而不直接打印輸出。你可以將其存儲到變量中或用于其他處理。
語法:
String.format(format, arguments);
format是格式化字符串,包含格式說明符。arguments是要格式化的參數(shù)。
示例:
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 函數(shù)在 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 類提供了更多的格式化功能,允許你創(chuàng)建格式化的輸出流,并將其寫入到 StringBuilder、PrintWriter 等對象中。
示例:
import java.util.Formatter; // 導(dǎo)入 java.util.Formatter 類,用于格式化字符串
public class FormatterExample { // 定義一個名為 FormatterExample 的類
public static void main(String[] args) { // 主方法,程序的入口點
Formatter formatter = new Formatter(); // 創(chuàng)建一個 Formatter 對象,用于格式化字符串
formatter.format("My age is %d", 25); // 使用 format 方法格式化字符串
// "My age is %d" 是格式化模板,%d 是占位符,表示一個整數(shù)
// 25 是傳遞給占位符 %d 的實際值
System.out.println(formatter); // 輸出格式化后的字符串到控制臺
formatter.close(); // 關(guān)閉 Formatter 對象,釋放資源
}
}
代碼分析:
Formatter類:用于格式化字符串。它類似于String.format()方法,但提供了更靈活的格式化方式。format方法:接受一個格式化模板和一組參數(shù)。模板中的%d是一個占位符,表示一個整數(shù)。System.out.println(formatter):Formatter對象在調(diào)用toString()方法時會返回其內(nèi)部的格式化字符串。formatter.close():關(guān)閉Formatter對象,釋放與之相關(guān)的資源。這是良好的編程習(xí)慣,尤其是在處理 I/O 資源時。
運行這段代碼后,控制臺會輸出:
My age is 25
二、 常見的格式說明符:
1. 整數(shù)類型格式化說明符
%d: 十進(jìn)制整數(shù)。- 用于格式化整數(shù)(例如:
123)。 - 示例:
System.out.printf("%d\n", 123);輸出:123
- 用于格式化整數(shù)(例如:
%o: 八進(jìn)制整數(shù)。- 用于輸出整數(shù)的八進(jìn)制表示。
- 示例:
System.out.printf("%o\n", 8);輸出:10
%x: 十六進(jìn)制整數(shù)(小寫字母)。- 用于輸出整數(shù)的十六進(jìn)制表示(小寫字母)。
- 示例:
System.out.printf("%x\n", 255);輸出:ff
%X: 十六進(jìn)制整數(shù)(大寫字母)。- 用于輸出整數(shù)的十六進(jìn)制表示(大寫字母)。
- 示例:
System.out.printf("%X\n", 255);輸出:FF
%c: 單個字符。- 用于格式化單個字符。
- 示例:
System.out.printf("%c\n", 'A');輸出:A
2. 浮點類型格式化說明符
%f: 浮點數(shù)。- 默認(rèn)輸出浮點數(shù),小數(shù)點后有六位。
- 示例:
System.out.printf("%f\n", 123.456);輸出:123.456000
%.nf: 浮點數(shù)(保留 n 位小數(shù))。- 用于格式化浮點數(shù)并指定保留的小數(shù)位數(shù)。
- 示例:
System.out.printf("%.2f\n", 123.456);輸出:123.46
%e: 科學(xué)計數(shù)法(小寫字母)。- 用于格式化浮點數(shù)為科學(xué)計數(shù)法表示(小寫字母)。
- 示例:
System.out.printf("%e\n", 1234567.89);輸出:1.234568e+06
%E: 科學(xué)計數(shù)法(大寫字母)。- 用于格式化浮點數(shù)為科學(xué)計數(shù)法表示(大寫字母)。
- 示例:
System.out.printf("%E\n", 1234567.89);輸出:1.234568E+06
%g: 自動選擇浮動或科學(xué)計數(shù)法(小寫字母)。- 根據(jù)數(shù)字的大小自動選擇浮動或科學(xué)計數(shù)法。
- 示例:
System.out.printf("%g\n", 1234567.89);輸出:1234567.89
%G: 自動選擇浮動或科學(xué)計數(shù)法(大寫字母)。- 根據(jù)數(shù)字的大小自動選擇浮動或科學(xué)計數(shù)法(大寫字母)。
- 示例:
System.out.printf("%G\n", 1234567.89);輸出:1234567.89
3. 字符串格式化說明符
%s: 字符串。- 用于格式化字符串。
- 示例:
System.out.printf("%s\n", "Hello, World!");輸出:Hello, World!
4. 日期和時間格式化說明符
日期和時間的格式化說明符以 %t 開頭,后跟日期/時間的特定類型。
%tY: 年份(四位數(shù)字)。- 示例:
System.out.printf("%tY\n", new Date());輸出:2025
- 示例:
%tm: 月份(數(shù)字表示,01 到 12)。- 示例:
System.out.printf("%tm\n", new Date());輸出:01
- 示例:
%td: 日期(數(shù)字表示,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)
寬度選項用于控制輸出數(shù)據(jù)的最小字符寬度。如果格式化的內(nèi)容小于指定寬度,Java 會根據(jù)其他選項(如填充符)來填充剩余的空間。
語法:
%[width]specifier
- width:指定最小的輸出寬度。
- specifier:格式化說明符(如
%d、%f、%s等)。
示例:
System.out.printf("|%10d|\n", 123); // 輸出:| 123|
System.out.printf("|%-10d|\n", 123); // 輸出:|123 |
|%10d|:輸出寬度為 10,如果數(shù)字少于 10 個字符寬度,前面會用空格填充。|%-10d|:輸出寬度為 10,左對齊,后面用空格填充。
2. 精度(Precision)
精度用于控制浮點數(shù)的小數(shù)位數(shù)以及字符串的最大長度。
2.1. 浮點數(shù)的精度:
對于浮點數(shù),可以指定小數(shù)點后保留的位數(shù)。
語法:
%.[precision]f
- precision:指定浮點數(shù)小數(shù)點后的位數(shù)。
示例:
System.out.printf("%.2f\n", 123.456); // 輸出:123.46
System.out.printf("%.3f\n", 123.456); // 輸出:123.456
%.2f:保留 2 位小數(shù)。%.3f:保留 3 位小數(shù)。
2.2. 字符串的精度:
對于字符串,可以指定輸出字符串的最大字符數(shù)。
示例:
System.out.printf("%.5s\n", "HelloWorld"); // 輸出:Hello
%.5s:輸出字符串的前 5 個字符。
3. 填充符(Padding Character)
填充符用于控制當(dāng)數(shù)據(jù)不夠?qū)挾葧r,用指定的字符填充空白位置。默認(rèn)情況下,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)
默認(rèn)情況下,數(shù)字和字符串都會右對齊。但可以通過指定符號來改變對齊方式。
-:左對齊。- 默認(rèn)為右對齊。
示例:
System.out.printf("|%-10d|\n", 123); // 輸出:|123 | 左對齊
System.out.printf("|%10d|\n", 123); // 輸出:| 123| 右對齊(默認(rèn))
%-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. 寬度和精度的組合使用
我們可以組合使用寬度和精度來進(jìn)一步控制輸出格式。例如,控制浮點數(shù)的總寬度以及小數(shù)點后位數(shù)。
示例:
System.out.printf("|%10.2f|\n", 123.456); // 輸出:| 123.46|
|%10.2f|:總寬度為 10,其中小數(shù)點后保留 2 位。
8. 自動選擇浮動或科學(xué)計數(shù)法(%g 和 %G)
%g:自動選擇使用浮動(普通表示法)或科學(xué)計數(shù)法(小寫字母)。%G:自動選擇使用浮動(普通表示法)或科學(xué)計數(shù)法(大寫字母)。
示例:
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. 對齊與填充符結(jié)合
填充符與對齊選項結(jié)合使用時,可以非常精細(xì)地控制輸出的格式,常用于表格輸出等。
示例:
System.out.printf("|%0-10d|\n", 123); // 輸出:|123 | 左對齊并用0填充
//然而,0 和 - 是互斥的,因為 - 表示左對齊,而 0 表示用 0 填充空白部分。
//當(dāng)它們同時出現(xiàn)時,0 的行為會被忽略,只有 - 生效。
System.out.printf("|%0+10d|\n", 123); // 輸出:|+0000123| 右對齊并用0填充,帶符號
四、 格式化日期:
Java 中的日期格式化通常依賴于 java.text.SimpleDateFormat 類來實現(xiàn),但如果使用 String.format() 或 System.out.printf(),日期格式化通過 t 系列的格式化說明符進(jìn)行。
1. %t 系列格式化說明符
日期和時間的格式化說明符以 %t 開頭,并跟隨一個字母,表示不同的日期和時間部分。常用的日期格式化說明符如下(前文有詳細(xì)描述):
日期部分:
%tY:年份(四位數(shù)字,例如2025)。%tm:月份(兩位數(shù)字,例如01,12)。%td:日期(兩位數(shù)字,例如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; // 導(dǎo)入 java.util.Date 類,用于表示日期和時間
public class DateFormatExample { // 定義一個名為 DateFormatExample 的類
public static void main(String[] args) { // 主方法,程序的入口點
Date date = new Date(); // 創(chuàng)建一個 Date 對象,表示當(dāng)前日期和時間
System.out.printf("Formatted date: %tF\n", date); // 輸出:2025-01-21
// 使用 printf 方法格式化日期
// %tF 是一個格式化占位符,表示按照 ISO 8601 格式(yyyy-MM-dd)輸出日期
// date 是傳遞給占位符的實際日期對象
// 輸出結(jié)果為:Formatted date: 2025-01-21(假設(shè)當(dāng)前日期是 2025 年 1 月 21 日)
}
}
%tF輸出完整的日期,格式為YYYY-MM-DD。
示例 2:格式化時間(HH:MM:SS)
import java.util.Date; // 導(dǎo)入 java.util.Date 類,用于表示當(dāng)前日期和時間
public class DateFormatExample { // 定義一個名為 DateFormatExample 的類
public static void main(String[] args) { // 主方法,程序的入口點
Date date = new Date(); // 創(chuàng)建一個 Date 對象,表示當(dāng)前日期和時間
System.out.printf("Formatted time: %tT\n", date); // 輸出:14:30:45
// 使用 printf 方法格式化時間
// %tT 是一個格式化占位符,表示按照 24 小時制格式(HH:mm:ss)輸出時間
// date 是傳遞給占位符的實際日期對象
// 輸出結(jié)果為:Formatted time: 14:30:45(假設(shè)當(dāng)前時間是 14:30:45)
}
}
%tT輸出時間,格式為HH:MM:SS。
示例 3:格式化為月份名稱和日期(Month Day, Year)
import java.util.Date; // 導(dǎo)入 java.util.Date 類,用于表示日期和時間
public class DateFormatExample { // 定義一個名為 DateFormatExample 的類
public static void main(String[] args) { // 主方法,程序的入口點
Date date = new Date(); // 創(chuàng)建一個 Date 對象,表示當(dāng)前日期和時間
System.out.printf("Formatted date with month name: %tB %td, %tY\n", date, date, date); // 輸出:January 21, 2025
// 使用 printf 方法格式化日期,并在輸出中包含月份名稱
// %tB:格式化為月份的完整名稱(例如 January、February 等)
// %td:格式化為日期的天數(shù)部分(例如 01 到 31)
// %tY:格式化為四位年份(例如 2025)
// date 是傳遞給占位符的實際日期對象,這里重復(fù)傳遞了三次 date,分別對應(yīng) %tB、%td 和 %tY
// 輸出結(jié)果為:Formatted date with month name: January 21, 2025(假設(shè)當(dāng)前日期是 2025 年 1 月 21 日)
}
}
%tB輸出完整的月份名稱,%td輸出日期,%tY輸出年份。
示例 4:格式化為12小時制(AM/PM)
import java.util.Date; // 導(dǎo)入 java.util.Date 類,用于表示日期和時間
public class DateFormatExample { // 定義一個名為 DateFormatExample 的類
public static void main(String[] args) { // 主方法,程序的入口點
Date date = new Date(); // 創(chuàng)建一個 Date 對象,表示當(dāng)前日期和時間
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 是傳遞給占位符的實際日期對象,這里重復(fù)傳遞了三次 date,分別對應(yīng) %tI、%tM 和 %tp
// 輸出結(jié)果為:Formatted time in 12-hour format: 02:30 PM(假設(shè)當(dāng)前時間是 14:30)
}
}
%tI輸出 12 小時制的小時數(shù),%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. 控制輸出寬度和填充
當(dāng)然,和其他格式化類型一樣,我們也可以控制日期和時間輸出的寬度以及如何填充空白。通過指定寬度,可以保證輸出符合要求的格式。
示例:控制日期寬度
import java.util.Date; // 導(dǎo)入 java.util.Date 類,用于表示日期和時間
public class DateFormatExample { // 定義一個名為 DateFormatExample 的類
public static void main(String[] args) { // 主方法,程序的入口點
Date date = new Date(); // 創(chuàng)建一個 Date 對象,表示當(dāng)前日期和時間
System.out.printf("|%20tF|\n", date); // 使用 printf 方法格式化日期并輸出
// %tF:格式化日期為 ISO 8601 格式,即 yyyy-MM-dd(例如 2025-01-21)
// 20:指定字段寬度為 20 個字符
// 默認(rèn)情況下,字符串會右對齊,因此左側(cè)會填充空格以達(dá)到指定的寬度
// 輸出結(jié)果為:| 2025-01-21|(假設(shè)當(dāng)前日期是 2025-01-21)
}
}
%20tF表示寬度為 20,并且不足部分將會填充空格。
示例:控制時間寬度和填充
import java.util.Date; // 導(dǎo)入 java.util.Date 類,用于表示日期和時間
public class DateFormatExample { // 定義一個名為 DateFormatExample 的類
public static void main(String[] args) { // 主方法,程序的入口點
Date date = new Date(); // 創(chuàng)建一個 Date 對象,表示當(dāng)前日期和時間
System.out.printf("|%10tT|\n", date); // 使用 printf 方法格式化時間并輸出
// %tT:格式化時間為 24 小時制格式,即 HH:mm:ss(例如 14:30:45)
// 10:指定字段寬度為 10 個字符
// 默認(rèn)情況下,字符串會右對齊,因此如果格式化后的時間字符串長度小于 10 個字符,
// 左側(cè)會填充空格以達(dá)到指定的寬度
// 輸出結(jié)果為:|14:30:45 |(假設(shè)當(dāng)前時間是 14:30:45)
}
}
%10tT指定時間的寬度為 10,左側(cè)填充空格。- 如果需要左對齊,可以在格式化占位符中添加
-符號,例如:%-10tT。這樣,空格會填充在右側(cè)。
5. 日期格式化與 SimpleDateFormat 類結(jié)合使用
String.format() 和 System.out.printf() 適用于簡單的日期格式化,但如果需要更復(fù)雜的格式化(例如自定義格式),可以使用 SimpleDateFormat 類。
示例:自定義日期格式化(使用 SimpleDateFormat)
import java.text.SimpleDateFormat; // 導(dǎo)入 SimpleDateFormat 類,用于自定義日期和時間的格式化
import java.util.Date; // 導(dǎo)入 Date 類,用于表示日期和時間
public class SimpleDateFormatExample { // 定義一個名為 SimpleDateFormatExample 的類
public static void main(String[] args) { // 主方法,程序的入口點
Date date = new Date(); // 創(chuàng)建一個 Date 對象,表示當(dāng)前日期和時間
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
// 創(chuàng)建一個 SimpleDateFormat 對象,用于自定義日期和時間的格式化
// "yyyy/MM/dd HH:mm:ss" 是格式化模板:
// yyyy:四位年份
// MM:兩位月份
// dd:兩位日期
// HH:兩位24小時制的小時
// mm:兩位分鐘
// ss:兩位秒數(shù)
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(假設(shè)當(dāng)前時間是 2025 年 1 月 21 日 14:30:45)
}
}
SimpleDateFormat允許你創(chuàng)建一個自定義的日期格式,例如"yyyy/MM/dd HH:mm:ss"。SimpleDateFormat是線程不安全的,因此在多線程環(huán)境中使用時需要特別注意。- 如果需要線程安全的日期格式化工具,可以使用
java.time.format.DateTimeFormatter(Java 8 及以上版本)。
總結(jié)
String.format()返回格式化后的字符串。System.out.printf()直接輸出格式化字符串到控制臺。Formatter提供了更多的控制,可以用于自定義輸出流。
到此這篇關(guān)于Java格式化輸出的文章就介紹到這了,更多相關(guān)Java格式化輸出內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis 中 ${}和 #{}的正確使用方法(千萬不要亂用)
這篇文章主要介紹了MyBatis 中 ${}和 #{}的正確使用方法,本文給大家提到了MyBatis 中 ${}和 #{}的區(qū)別,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
SpringBoot配置文件加載順序與優(yōu)先級的詳細(xì)步驟
在?Spring?Boot?應(yīng)用中,配置文件的加載順序和優(yōu)先級決定了最終生效的配置值,理解這一機(jī)制對于正確管理應(yīng)用配置至關(guān)重要,所以本文給大家介紹了SpringBoot配置文件加載順序與優(yōu)先級的詳細(xì)步驟,需要的朋友可以參考下2026-01-01
詳解SpringBoot中的統(tǒng)一結(jié)果返回與統(tǒng)一異常處理
這篇文章主要將通過詳細(xì)的討論和實例演示來幫助你更好地理解和應(yīng)用Spring Boot中的統(tǒng)一結(jié)果返回和統(tǒng)一異常處理,感興趣的小伙伴可以了解下2024-03-03
Java 高并發(fā)九:鎖的優(yōu)化和注意事項詳解
本文主要介紹Java高并發(fā)鎖的優(yōu)化和注意事項,這里整理了詳細(xì)的資料,并講解了 1. 鎖優(yōu)化的思路和方法 2. 虛擬機(jī)內(nèi)的鎖優(yōu)化 3. 一個錯誤使用鎖的案例 4. ThreadLocal及其源碼分析等知識,有需要的小伙伴可以參考下2016-09-09
SpringCloud超詳細(xì)講解Feign聲明式服務(wù)調(diào)用
Feign可以把Rest的請求進(jìn)行隱藏,偽裝成類似Spring?MVC的Controller一樣。不用再自己拼接url,拼接參數(shù)等等操作,一切都交給Feign去做2022-06-06
springboot一個自定義注解如何搞定多線程事務(wù)
文章介紹了Spring?Boot中使用`@Async`注解進(jìn)行聲明式多線程編程的方法,以及如何通過自定義注解和AOP實現(xiàn)多線程事務(wù)控制,同時,還解釋了`CountDownLatch`的使用場景及其工作原理2024-12-12

