Java字符串格式化工具String.format()完整用法指南
前言
String.format()是 Java 中最核心的字符串格式化工具,能根據(jù)指定模板和參數(shù)生成標(biāo)準(zhǔn)化字符串,替代硬編碼拼接,提升代碼可讀性和跨平臺(tái)兼容性。以下是其完整、系統(tǒng)的用法講解。
一、基礎(chǔ)認(rèn)知
核心作用
將普通文本與動(dòng)態(tài)參數(shù)按指定格式拼接,返回格式化后的字符串(類似 C 語(yǔ)言printf,但不直接輸出,僅返回字符串)。
核心語(yǔ)法
提供兩個(gè)重載方法,日常開(kāi)發(fā)中前者更常用:
// 1. 默認(rèn)本地環(huán)境(Locale):適配當(dāng)前系統(tǒng)的數(shù)字/日期格式 public static String format(String format, Object... args) // 2. 指定本地環(huán)境:比如強(qiáng)制使用英文/中文區(qū)域的日期/數(shù)字格式 public static String format(Locale l, String format, Object... args)
format:格式模板,包含普通文本和以%開(kāi)頭的格式說(shuō)明符(占位符);args:可變參數(shù),按順序匹配模板中的占位符(可通過(guò)參數(shù)索引復(fù)用 / 亂序)。
二、格式說(shuō)明符的完整結(jié)構(gòu)
格式說(shuō)明符是String.format()的核心,決定參數(shù)的格式化規(guī)則,完整結(jié)構(gòu)如下:
%[參數(shù)索引$][標(biāo)志][寬度][.精度]轉(zhuǎn)換符
各部分含義(必選 / 可選標(biāo)注):
| 組成部分 | 是否必選 | 說(shuō)明 |
|---|---|---|
% | 是 | 格式說(shuō)明符的起始標(biāo)記。 |
| 參數(shù)索引 $ | 否 | 指定使用第幾個(gè)參數(shù)(如%2$d表示第二個(gè)參數(shù)作為整數(shù)),可復(fù)用參數(shù)。 |
| 標(biāo)志 | 否 | 格式化修飾符(如左對(duì)齊、補(bǔ)零、千分位、顯示正負(fù)號(hào))。 |
| 寬度 | 否 | 指定輸出的最小字符數(shù)(不足時(shí)補(bǔ)空格 / 零,超出則按實(shí)際長(zhǎng)度)。 |
| . 精度 | 否 | 浮點(diǎn)數(shù):指定小數(shù)位數(shù);字符串:指定截取長(zhǎng)度;整數(shù) / 字符:無(wú)意義。 |
| 轉(zhuǎn)換符 | 是 | 核心,指定參數(shù)的類型(如整數(shù)、字符串、日期、進(jìn)制)。 |
三、全量常用轉(zhuǎn)換符
轉(zhuǎn)換符決定參數(shù)的解析類型,以下是覆蓋 99% 場(chǎng)景的全量常用轉(zhuǎn)換符(標(biāo)注「補(bǔ)充」為之前額外新增的):
| 轉(zhuǎn)換符 | 類型 | 說(shuō)明 | 示例(參數(shù)) | 輸出效果 |
|---|---|---|---|---|
d | 整數(shù)(十進(jìn)制) | 常規(guī)整數(shù)格式化 | %d (123) | 123 |
s | 字符串 | 任意對(duì)象都會(huì)調(diào)用toString()轉(zhuǎn)為字符串 | %s ("Java") | Java |
c | 字符 | 單個(gè)字符,參數(shù)為char或int(ASCII 碼) | %c ('A') | A |
b | 布爾值 | 非null/ 非false則輸出true,否則false | %b (true) | true |
f | 浮點(diǎn)數(shù)(小數(shù)) | 默認(rèn)保留 6 位小數(shù),可通過(guò)精度調(diào)整 | %f (3.1415) | 3.141500 |
e | 科學(xué)計(jì)數(shù)法 | 浮點(diǎn)數(shù)轉(zhuǎn)為科學(xué)計(jì)數(shù)法格式 | %e (123.45) | 1.234500e+02 |
t/T | 日期時(shí)間 | 配合子轉(zhuǎn)換符使用(如%tY= 年份),T表示結(jié)果大寫 | %tY (new Date()) | 2025 |
%tF | 日期(ISO 標(biāo)準(zhǔn)) | 【補(bǔ)充】快捷格式,等價(jià)于%tY-%tm-%td,輸出yyyy-MM-dd | %tF (new Date()) | 2025-12-26 |
%tD | 日期(美式) | 【補(bǔ)充】快捷格式,等價(jià)于%tm/%td/%ty,輸出MM/dd/yy | %tD (new Date()) | 12/26/25 |
x/X | 十六進(jìn)制整數(shù) | 【補(bǔ)充】%x小寫(a-f),%X大寫(A-F) | %X (255) | FF |
o | 八進(jìn)制整數(shù) | 【補(bǔ)充】十進(jìn)制轉(zhuǎn)八進(jìn)制 | %o (10) | 12 |
%% | 百分號(hào)本身 | 【補(bǔ)充】轉(zhuǎn)義輸出%,直接寫%會(huì)報(bào)錯(cuò) | %% () | % |
%n | 換行符 | 【補(bǔ)充】跨平臺(tái)換行(Windows=\r\n,Linux=\n),替代硬編碼\n | %n () | 系統(tǒng)對(duì)應(yīng)換行符 |
四、綜合實(shí)戰(zhàn)示例(覆蓋所有核心場(chǎng)景)
以下示例整合了基礎(chǔ)用法和補(bǔ)充格式符,可直接復(fù)制運(yùn)行:
import java.util.Date;
import java.util.Locale;
public class StringFormatCompleteDemo {
public static void main(String[] args) {
Date now = new Date();
// ========== 場(chǎng)景1:基礎(chǔ)類型格式化(字符串、整數(shù)、浮點(diǎn)數(shù)、布爾、字符) ==========
String basic = String.format(
"姓名:%s,年齡:%d,成績(jī):%.2f,是否及格:%b,等級(jí):%c",
"張三", 25, 89.567, true, 'A'
);
System.out.println("基礎(chǔ)類型:" + basic);
// 輸出:姓名:張三,年齡:25,成績(jī):89.57,是否及格:true,等級(jí):A
// ========== 場(chǎng)景2:寬度/標(biāo)志修飾(補(bǔ)零、左對(duì)齊、千分位、正負(fù)號(hào)) ==========
String modifier = String.format(
"編號(hào):%05d,姓名:%-10s,金額:%,d 元,溫度:%+d℃",
123, "李四", 1234567, -5
);
System.out.println("寬度/標(biāo)志:" + modifier);
// 輸出:編號(hào):00123,姓名:李四 ,金額:1,234,567 元,溫度:-5℃
// ========== 場(chǎng)景3:日期時(shí)間格式化(含快捷格式%tF/%tD) ==========
String date = String.format(
"ISO日期:%tF,美式日期:%tD,完整時(shí)間:%tF %tT%n",
now, now, now, now
);
System.out.println("日期時(shí)間:" + date);
// 輸出:ISO日期:2025-12-26,美式日期:12/26/25,完整時(shí)間:2025-12-26 15:30:45(示例)
// ========== 場(chǎng)景4:進(jìn)制轉(zhuǎn)換(十六進(jìn)制%X、八進(jìn)制%o) ==========
String radix = String.format(
"255的十六進(jìn)制(大寫):%04X,10的八進(jìn)制:%03o",
255, 10
);
System.out.println("進(jìn)制轉(zhuǎn)換:" + radix);
// 輸出:255的十六進(jìn)制(大寫):00FF,10的八進(jìn)制:012
// ========== 場(chǎng)景5:特殊符號(hào)(百分號(hào)%%、跨平臺(tái)換行%n) ==========
String special = String.format(
"成功率:%.1f%%%n第一行內(nèi)容%n第二行內(nèi)容",
99.5
);
System.out.println("特殊符號(hào):" + special);
// 輸出:成功率:99.5%
// 第一行內(nèi)容
// 第二行內(nèi)容
// ========== 場(chǎng)景6:參數(shù)索引(復(fù)用/亂序參數(shù)) ==========
String index = String.format(
"數(shù)字:%2$d,字符串:%1$s,再次使用數(shù)字:%2$d",
"測(cè)試", 666
);
System.out.println("參數(shù)索引:" + index);
// 輸出:數(shù)字:666,字符串:測(cè)試,再次使用數(shù)字:666
}
}
五、注意事項(xiàng)
- 參數(shù)匹配:占位符數(shù)量需與參數(shù)數(shù)量匹配(參數(shù)索引復(fù)用除外),否則拋
MissingFormatArgumentException; - 類型匹配:轉(zhuǎn)換符需與參數(shù)類型匹配(如
%d不能接收字符串),否則拋IllegalFormatConversionException; - 浮點(diǎn)數(shù)精度:
%.2f會(huì)自動(dòng)四舍五入(如3.145→3.15); - 轉(zhuǎn)義規(guī)則:輸出
%必須用%%,直接寫%會(huì)被識(shí)別為格式符起始標(biāo)記導(dǎo)致報(bào)錯(cuò); - 跨平臺(tái)兼容:優(yōu)先用
%n替代\n,避免 Windows/Linux 換行符不一致問(wèn)題; - 日期參數(shù):
%tF/%tD僅支持Date/Calendar/LocalDateTime等日期類型參數(shù)。
六、核心總結(jié)
- 核心結(jié)構(gòu):格式說(shuō)明符的核心是
%+轉(zhuǎn)換符(必選),參數(shù)索引、標(biāo)志、寬度、精度為可選修飾,可靈活控制輸出樣式; - 高頻轉(zhuǎn)換符:
- 基礎(chǔ)類型:
%d(整數(shù))、%s(字符串)、%f(浮點(diǎn)數(shù)); - 日期:
%tF(ISO 標(biāo)準(zhǔn)日期)、%tT(完整時(shí)間); - 特殊場(chǎng)景:
%X(十六進(jìn)制)、%%(百分號(hào))、%n(跨平臺(tái)換行);
- 基礎(chǔ)類型:
- 最佳實(shí)踐:避免硬編碼拼接字符串,用
String.format()實(shí)現(xiàn)標(biāo)準(zhǔn)化輸出;優(yōu)先用%tF/%tT簡(jiǎn)化日期格式化,用%n保證跨平臺(tái)兼容性。
到此這篇關(guān)于Java字符串格式化工具String.format()完整用法的文章就介紹到這了,更多相關(guān)Java String.format ()用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java多線程中的ThreadPoolExecutor使用解析
這篇文章主要介紹了Java多線程中的ThreadPoolExecutor使用解析,作為線程池的緩沖,當(dāng)新增線程超過(guò)maximumPoolSize時(shí),會(huì)將新增線程暫時(shí)存放到該隊(duì)列中,需要的朋友可以參考下2023-12-12
JAVA設(shè)計(jì)模式之訪問(wèn)者模式詳解
這篇文章主要介紹了JAVA設(shè)計(jì)模式之訪問(wèn)者模式詳解,訪問(wèn)者模式是對(duì)象的行為模式,訪問(wèn)者模式的目的是封裝一些施加于某種數(shù)據(jù)結(jié)構(gòu)元素之上的操作,需要的朋友可以參考下2015-04-04
在Java項(xiàng)目中實(shí)現(xiàn)日志輸出的技巧分享
日志是開(kāi)發(fā)過(guò)程中不可或缺的一部分,它可以幫助我們追蹤代碼的執(zhí)行過(guò)程、排查問(wèn)題以及監(jiān)控系統(tǒng)運(yùn)行狀況,然而,大多數(shù)開(kāi)發(fā)人員在編寫日志時(shí)往往只關(guān)注于輸出必要的信息,而忽略了日志的可讀性和美觀性,本文將介紹如何在Java項(xiàng)目中實(shí)現(xiàn)漂亮的日志輸出2023-10-10
struts2中simple主題下<s:fieldError>標(biāo)簽?zāi)J(rèn)樣式的移除方法
這篇文章主要給大家介紹了關(guān)于struts2中simple主題下<s:fieldError>標(biāo)簽?zāi)J(rèn)樣式的移除方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10
Java NIO:淺析IO模型_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
在進(jìn)入Java NIO編程之前,我們今天先來(lái)討論一些比較基礎(chǔ)的知識(shí):I/O模型。對(duì)java io nio相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2017-05-05
解決MyBatis-Plus使用動(dòng)態(tài)表名selectPage不生效的問(wèn)題
這篇文章主要介紹了如惡化解決MyBatis-Plus使用動(dòng)態(tài)表名selectPage不生效的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11
徹底理解Spring注解@Autowired實(shí)現(xiàn)原理
這篇文章主要為大家詳細(xì)的介紹了Spring注解@Autowired實(shí)現(xiàn)的原理,縝密的邏輯分析,實(shí)踐應(yīng)用示例操作說(shuō)明,讓大家徹底的理解Spring注解@Autowired背后實(shí)現(xiàn)原理2022-03-03

