欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java字符串格式化Formatter和printf()的使用詳解

 更新時(shí)間:2025年05月01日 10:22:36   作者:面朝大海,春不暖,花不開  
這篇文章主要介紹了Java字符串格式化Formatter和printf()的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

在 Java 編程中,字符串格式化是一項(xiàng)基本且重要的技能。它允許開發(fā)者以特定的方式將各種類型的數(shù)據(jù)(如數(shù)字、日期、字符串等)轉(zhuǎn)換為字符串,以便于顯示、存儲(chǔ)或傳輸。

Java 提供了多種方法來實(shí)現(xiàn)字符串格式化,其中最常用的是 String.format()、Java 15 引入的 string.formatted() 實(shí)例方法,以及 PrintStreamPrintWriter 類中的 printf() 方法。

這些方法都依賴于 java.util.Formatter 類,該類使用類似于 C 語言 printf() 函數(shù)的格式代碼。

字符串格式化的方法

Java 提供了三種主要的字符串格式化方法,每種方法都有其特定的使用場(chǎng)景:

1.String.format()

這是一個(gè)靜態(tài)方法,用于創(chuàng)建一個(gè)格式化的字符串。它接受一個(gè)格式字符串和一系列參數(shù),返回一個(gè)格式化后的字符串。適用于需要將格式化結(jié)果存儲(chǔ)為字符串的場(chǎng)景。

示例:

String str = String.format("Hello %s, today is %tF%n", "World", LocalDate.now());
System.out.println(str);

輸出示例:

Hello World, today is 2025-04-27

2.string.formatted()

從 Java 15 開始,字符串實(shí)例提供了一個(gè) formatted() 方法,可以直接對(duì)字符串進(jìn)行格式化。其功能與 String.format() 類似,但語法更簡(jiǎn)潔,適合需要快速格式化的場(chǎng)景。

示例:

String str = "Hello %s, today is %tF%n".formatted("World", LocalDate.now());
System.out.println(str);

輸出示例:

Hello World, today is 2025-04-27

3.printf()

PrintStreamPrintWriter 類提供了 printf() 方法,可以直接將格式化的字符串輸出到流中(如控制臺(tái)或文件)。它適合需要立即輸出的場(chǎng)景。

示例:

System.out.printf("Hello %s, today is %tF%n", "World", LocalDate.now());

輸出示例:

Hello World, today is 2025-04-27

格式字符串的結(jié)構(gòu)

格式字符串由普通字符和格式代碼組成。普通字符按原樣輸出,而格式代碼以 % 開頭,用于指定如何格式化參數(shù)。格式代碼的完整結(jié)構(gòu)如下:

% [argument_index$] [flags] [width] [.precision] conversion
  • argument_index$:可選,指定要格式化的參數(shù)索引(從 1 開始)。例如,%1$s 表示第一個(gè)參數(shù)作為字符串。
  • flags:可選,控制輸出格式,如 - 表示左對(duì)齊,0 表示用 0 填充。
  • width:可選,指定字段的最小寬度。
  • .precision:可選,對(duì)于浮點(diǎn)數(shù),指定小數(shù)點(diǎn)后位數(shù);對(duì)于字符串,指定最大字符數(shù)。
  • conversion:必須,指定數(shù)據(jù)類型,如 d(十進(jìn)制整數(shù))、f(浮點(diǎn)數(shù))、s(字符串)等。

例如,%04d 表示將整數(shù)格式化為至少 4 位,不足時(shí)前面補(bǔ) 0;%4.2f 表示浮點(diǎn)數(shù)總寬度至少 4 位,小數(shù)點(diǎn)后 2 位。

常用格式代碼

以下是 java.util.Formatter 類支持的一些常用格式代碼:

格式代碼含義
%b布爾值(true 或 false)
%c字符
%d十進(jìn)制整數(shù)(無小數(shù)點(diǎn))
%f浮點(diǎn)數(shù)(帶小數(shù)部分)
%s字符串(通用格式)
%t日期/時(shí)間(需后跟具體代碼)
%n平臺(tái)相關(guān)的換行符
%%字面上的 % 字符

對(duì)于某些代碼(如 %b、%c%s),使用大寫形式(如 %S)會(huì)將結(jié)果轉(zhuǎn)換為大寫。

日期和時(shí)間格式化

日期和時(shí)間格式化使用 %t 前綴,后跟一個(gè)字符來指定具體格式。

以下是一些常用的日期/時(shí)間格式代碼:

格式代碼含義
%tA星期幾的完整名稱(如“星期日”)
%ta星期幾的縮寫名稱(如“周日”)
%tB月份的完整名稱(如“一月”)
%tb月份的縮寫名稱(如“一月”)
%td月份中的天(兩位數(shù),如“01”)
%tY年份(至少四位,如“2025”)
%tFISO 8601 日期格式(YYYY-MM-DD)

日期格式化通常與 LocalDate、DateCalendar 等對(duì)象一起使用。

需要注意的是,當(dāng)對(duì)同一日期對(duì)象格式化多個(gè)字段時(shí),必須為每個(gè)格式代碼指定參數(shù)索引(如 %1$tY)。

代碼示例

以下是一些實(shí)際應(yīng)用中的格式化示例,涵蓋數(shù)字、字符串和日期。

1. 格式化數(shù)字

System.out.printf("%04d - the year of %f%n", 1956, Math.PI);
  • 輸出:1956 - the year of 3.141593
  • 說明:%04d 確保年份顯示為 4 位,前面補(bǔ) 0;%f 顯示浮點(diǎn)數(shù) Math.PI 的完整值。

2. 控制浮點(diǎn)數(shù)精度

System.out.printf("PI is approximately %4.2f%n", Math.PI);
  • 輸出:PI is approximately 3.14
  • 說明:%4.2f 指定浮點(diǎn)數(shù)總寬度至少 4 位,小數(shù)點(diǎn)后保留 2 位。

3. 格式化日期

LocalDate today = LocalDate.now();
System.out.printf("Today is %1$tB %1$td, %1$tY%n", today);
  • 輸出示例:Today is April 27, 2025
  • 說明:%1$tB 顯示月份名稱,%1$td 顯示日期,%1$tY 顯示年份,1$ 確保使用同一個(gè) LocalDate 對(duì)象。

4. 使用參數(shù)索引重復(fù)格式化

System.out.printf("%1$tY-%1$tm-%1$td%n", LocalDate.now());
  • 輸出示例:2025-04-27
  • 說明:通過 1$ 指定使用第一個(gè)參數(shù)(LocalDate.now()),分別提取年、月、日。

5. 寫入文件

try (Formatter formatter = new Formatter("output.txt")) {
    formatter.format("Price: $%5.2f%n", 27.99);
}

說明:將格式化結(jié)果寫入文件 output.txt,內(nèi)容為 Price: $27.99。

最佳實(shí)踐和注意事項(xiàng)

  • 安全性:避免使用用戶提供的格式字符串,因?yàn)楦袷阶址赡鼙粣阂鈽?gòu)造,導(dǎo)致安全漏洞。例如,攻擊者可能利用格式代碼訪問不應(yīng)訪問的數(shù)據(jù)。始終對(duì)用戶輸入進(jìn)行驗(yàn)證和清理。
  • 國(guó)際化:在多語言應(yīng)用中,直接使用日期格式代碼(如 %tB)可能不適合所有地區(qū),因?yàn)椴煌Z言對(duì)日期的顯示順序和格式有不同要求。建議使用 java.time.format.DateTimeFormatter 來處理國(guó)際化日期格式化。
  • 平臺(tái)無關(guān)性:使用 %n 作為換行符,而不是硬編碼 \n,因?yàn)?%n 會(huì)根據(jù)運(yùn)行平臺(tái)自動(dòng)選擇正確的換行符。
  • 性能:對(duì)于高性能場(chǎng)景,避免頻繁創(chuàng)建 Formatter 對(duì)象。可以復(fù)用 Formatter 實(shí)例或直接使用 String.format()printf()。

關(guān)于 StringTemplate 的說明

Java 21 和 22 引入了 StringTemplate 作為預(yù)覽功能,旨在提供更簡(jiǎn)潔的字符串插值方式,例如 STR."Hello \{name}"。然而,由于設(shè)計(jì)上的問題,該功能在 Java 23 中被撤回。根據(jù) Java StringTemplate Discussion,開發(fā)團(tuán)隊(duì)正在探索更安全和優(yōu)雅的實(shí)現(xiàn)方案,但目前尚無明確的時(shí)間表。

總結(jié)

Java 的字符串格式化工具通過 Formatter 類及其相關(guān)方法,為開發(fā)者提供了強(qiáng)大的數(shù)據(jù)格式化能力。無論是格式化數(shù)字、字符串還是日期,String.format()string.formatted()printf() 都能滿足各種需求。通過掌握格式代碼的結(jié)構(gòu)和用法,開發(fā)者可以編寫更清晰、更高效的代碼。然而,在使用時(shí)需注意安全性和國(guó)際化問題,以確保代碼的健壯性和可移植性。

格式代碼種類繁多,本文僅介紹了最常用的部分。欲了解完整列表,請(qǐng)參閱 Java Formatter Documentation。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • EasyExcel工具讀取Excel空數(shù)據(jù)行問題的解決辦法

    EasyExcel工具讀取Excel空數(shù)據(jù)行問題的解決辦法

    EasyExcel是阿里巴巴開源的一個(gè)excel處理框架,以使用簡(jiǎn)單,節(jié)省內(nèi)存著稱,下面這篇文章主要給大家介紹了關(guān)于EasyExcel工具讀取Excel空數(shù)據(jù)行問題的解決辦法,需要的朋友可以參考下
    2022-08-08
  • Java填充替換數(shù)組元素實(shí)例詳解

    Java填充替換數(shù)組元素實(shí)例詳解

    這篇文章主要通過兩個(gè)實(shí)例說明Java填充和替換數(shù)組中元素的方法,需要的朋友可以參考下。
    2017-08-08
  • java中SpringBoot?自動(dòng)裝配的原理分析

    java中SpringBoot?自動(dòng)裝配的原理分析

    這篇文章主要介紹了SpringBoot?自動(dòng)裝配的原理分析的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • idea配置gradle全過程

    idea配置gradle全過程

    安裝Gradle首先需要解壓安裝包到指定目錄,隨后配置環(huán)境變量GRDLE_HOME和GRADLE_USER_HOME,這里的GRADLE_USER_HOME是指文件下載的路徑,安裝后,通過命令行輸入gradle -v來測(cè)試是否安裝成功,對(duì)于Idea的配置,需要通過File->Setting->Gradle進(jìn)行
    2024-10-10
  • MyBatis SpringMVC整合實(shí)現(xiàn)步驟詳解

    MyBatis SpringMVC整合實(shí)現(xiàn)步驟詳解

    這篇文章主要介紹了MyBatis SpringMVC整合實(shí)現(xiàn)步驟詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java中的ReentrantReadWriteLock使用詳解

    Java中的ReentrantReadWriteLock使用詳解

    這篇文章主要介紹了Java中的ReentrantReadWriteLock使用詳解,ReentrantReadWriteLock是Java中的一個(gè)鎖實(shí)現(xiàn),它提供了讀寫分離的功能,這種讀寫分離的機(jī)制可以提高并發(fā)性能,特別適用于讀多寫少的場(chǎng)景,需要的朋友可以參考下
    2023-11-11
  • SpringMVC中controller接收json數(shù)據(jù)的方法

    SpringMVC中controller接收json數(shù)據(jù)的方法

    這篇文章主要為大家詳細(xì)介紹了SpringMVC中controller接收json數(shù)據(jù)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • 淺拷貝和深拷貝原理分析

    淺拷貝和深拷貝原理分析

    Java 對(duì)象拷貝是為對(duì)象賦值的一種方式,簡(jiǎn)單來說就是創(chuàng)建一個(gè)和原對(duì)象相同的對(duì)象,新創(chuàng)建的對(duì)象是原對(duì)象的一個(gè)副本。面試官賊拉喜歡在面試的時(shí)候問一問你淺拷貝和深拷貝的原理
    2021-08-08
  • Mybatis(ParameterType)傳遞多個(gè)不同類型的參數(shù)方式

    Mybatis(ParameterType)傳遞多個(gè)不同類型的參數(shù)方式

    這篇文章主要介紹了Mybatis(ParameterType)傳遞多個(gè)不同類型的參數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Spring Boot整合Swagger2的完整步驟詳解

    Spring Boot整合Swagger2的完整步驟詳解

    這篇文章主要給大家介紹了關(guān)于Spring Boot整合Swagger2的完整步驟,文中通過示例代碼將整合的步驟一步步介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07

最新評(píng)論