Java 格式化輸出String.format() 示例解析
一、基本語(yǔ)法與結(jié)構(gòu)
1.1 核心語(yǔ)法
// 基礎(chǔ)語(yǔ)法
String formatted = String.format("格式字符串", 參數(shù)1, 參數(shù)2, ...);
// 等價(jià)寫(xiě)法(推薦)
String formatted = "格式字符串".formatted(參數(shù)1, 參數(shù)2, ...); // Java 15+
System.out.printf("格式字符串", 參數(shù)1, 參數(shù)2, ...); // 直接打印1.2 你的示例解析
double i = 3.1415926;
System.out.println(String.format("%.3f", i)); // 輸出: 3.142
%:格式說(shuō)明符開(kāi)始標(biāo)記.3:精度控制,保留3位小數(shù)f:格式類(lèi)型,表示浮點(diǎn)數(shù)i:要格式化的值
二、格式說(shuō)明符詳解
格式說(shuō)明符的完整結(jié)構(gòu):
%[參數(shù)索引$][標(biāo)志][寬度][.精度]轉(zhuǎn)換類(lèi)型
2.1 轉(zhuǎn)換類(lèi)型(必需)
| 轉(zhuǎn)換符 | 適用類(lèi)型 | 說(shuō)明 | 示例 |
|---|---|---|---|
%d | 整數(shù)類(lèi)型 | 十進(jìn)制整數(shù) | "%d", 42 → "42" |
%f | 浮點(diǎn)類(lèi)型 | 十進(jìn)制浮點(diǎn)數(shù) | "%.2f", 3.14159 → "3.14" |
%s | 任意對(duì)象 | 字符串 | "%s", "hello" → "hello" |
%c | 字符 | Unicode字符 | "%c", 65 → "A" |
%b | 布爾值 | true/false | "%b", true → "true" |
%x | 整數(shù) | 十六進(jìn)制 | "%x", 255 → "ff" |
%o | 整數(shù) | 八進(jìn)制 | "%o", 8 → "10" |
%e | 浮點(diǎn)數(shù) | 科學(xué)計(jì)數(shù)法 | "%e", 1000.0 → "1.000000e+03" |
%% | - | 百分號(hào)本身 | "折扣: %d%%", 20 → "折扣: 20%" |
2.2 寬度與精度
// 寬度:最小字符數(shù)(右對(duì)齊)
String.format("%5d", 42); // " 42" (前面3個(gè)空格)
String.format("%-5d", 42); // "42 " (左對(duì)齊,后面3個(gè)空格)
// 精度:對(duì)于浮點(diǎn)數(shù)控制小數(shù)位
String.format("%.2f", 3.14159); // "3.14"
String.format("%.3f", 1.5); // "1.500" (補(bǔ)零)
// 寬度和精度組合
String.format("%8.2f", 123.456); // " 123.46" (總寬8,2位小數(shù))2.3 標(biāo)志(Flags)
| 標(biāo)志 | 作用 | 示例 |
|---|---|---|
- | 左對(duì)齊 | "%-10s", "hi" → "hi " |
+ | 顯示正負(fù)號(hào) | "%+d", 42 → "+42" |
0 | 用零填充 | "%05d", 42 → "00042" |
, | 千位分隔符 | "%,d", 1000000 → "1,000,000" |
| 正數(shù)前加空格 | "% d", 42 → " 42" | |
( | 負(fù)數(shù)用括號(hào) | "% (d", -42 → "(42)" |
三、實(shí)際應(yīng)用示例
3.1 數(shù)字格式化
// 金融金額格式化
double price = 2999.99;
String.format("價(jià)格: ¥%,.2f", price); // "價(jià)格: ¥2,999.99"
// 百分比顯示
double rate = 0.856;
String.format("成功率: %.1f%%", rate * 100); // "成功率: 85.6%"
// 固定寬度表格數(shù)據(jù)
System.out.printf("%-10s %8s %8s%n", "商品", "單價(jià)", "數(shù)量");
System.out.printf("%-10s %8.2f %8d%n", "手機(jī)", 2999.99, 3);
System.out.printf("%-10s %8.2f %8d%n", "電腦", 5999.50, 1);輸出:
商品 單價(jià) 數(shù)量
手機(jī) 2999.99 3
電腦 5999.50 1
3.2 字符串格式化
// 固定寬度對(duì)齊
String.format("|%-20s|", "左對(duì)齊"); // "|左對(duì)齊 |"
String.format("|%20s|", "右對(duì)齊"); // "| 右對(duì)齊|"
// 截?cái)嘧址?
String.format("%.5s", "Hello World"); // "Hello"
// 多參數(shù)格式化
String name = "張三";
int age = 25;
double score = 89.5;
String.format("學(xué)生: %s, 年齡: %d, 分?jǐn)?shù): %.1f", name, age, score);
// "學(xué)生: 張三, 年齡: 25, 分?jǐn)?shù): 89.5"3.3 日期時(shí)間格式化
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
LocalDateTime now = LocalDateTime.now();
// 方式1:使用DateTimeFormatter(推薦)
String formatted1 = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
// 方式2:使用String.format
String formatted2 = String.format("%tF %tT", now, now); // "2024-01-15 14:30:25"常用日期格式符:
Date date = new Date();
String.format("%tY-%tm-%td", date, date, date); // "2024-01-15"
String.format("%tH:%tM:%tS", date, date, date); // "14:30:25"
String.format("%tA", date); // "星期一" (中文環(huán)境)四、參數(shù)索引與重用
4.1 參數(shù)索引(1$表示第一個(gè)參數(shù))
// 重用參數(shù)
String.format("%1$s的分?jǐn)?shù)是%2$d,%1$s的年齡是%3$d",
"張三", 95, 20);
// "張三的分?jǐn)?shù)是95,張三的年齡是20"
// 改變參數(shù)順序
String.format("%3$s %2$s %1$s", "A", "B", "C"); // "C B A"4.2 復(fù)雜示例:格式化表格
public class TableFormatter {
public static void main(String[] args) {
Object[][] data = {
{"商品A", 29.99, 150},
{"商品B", 159.50, 42},
{"商品C", 9.99, 1000}
};
System.out.println("=".repeat(40));
System.out.printf("%-15s %10s %10s%n", "商品名稱(chēng)", "單價(jià)", "庫(kù)存");
System.out.println("-".repeat(40));
for (Object[] row : data) {
System.out.printf("%-15s %10.2f %10d%n",
row[0], row[1], row[2]);
}
System.out.println("=".repeat(40));
}
}輸出:
========================================
商品名稱(chēng) 單價(jià) 庫(kù)存
----------------------------------------
商品A 29.99 150
商品B 159.50 42
商品C 9.99 1000
========================================
五、常見(jiàn)問(wèn)題與解決方案
5.1 精度問(wèn)題(浮點(diǎn)數(shù))
// 問(wèn)題:浮點(diǎn)數(shù)精度誤差
double d = 0.1 + 0.2; // 實(shí)際上是 0.30000000000000004
String.format("%f", d); // "0.300000"
// 解決方案1:使用BigDecimal
import java.math.BigDecimal;
BigDecimal bd = new BigDecimal("0.1").add(new BigDecimal("0.2"));
String.format("%.2f", bd); // "0.30"
// 解決方案2:使用DecimalFormat
import java.text.DecimalFormat;
DecimalFormat df = new DecimalFormat("#.##");
df.format(d); // "0.3"5.2 本地化支持
import java.util.Locale; // 默認(rèn)本地化 String.format(Locale.getDefault(), "%,.2f", 1234.56); // 特定本地化(如美國(guó)) String us = String.format(Locale.US, "%,.2f", 1234.56); // "1,234.56" // 特定本地化(如德國(guó)) String de = String.format(Locale.GERMANY, "%,.2f", 1234.56); // "1.234,56" // 貨幣格式化 import java.text.NumberFormat; NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.CHINA); nf.format(1234.56); // "¥1,234.56"
5.3 性能優(yōu)化
// 大量格式化時(shí)重用Formatter
import java.util.Formatter;
StringBuilder sb = new StringBuilder();
try (Formatter formatter = new Formatter(sb)) {
for (int i = 0; i < 10000; i++) {
formatter.format("第%d行: %.2f%n", i, Math.random());
}
}
String result = sb.toString();六、實(shí)用技巧匯總
6.1 快速格式化方法
// Java 15+ 的便捷方法
String result = "姓名: %s, 分?jǐn)?shù): %.1f".formatted("李四", 95.5);
// 鏈?zhǔn)秸{(diào)用
String message = String.format("%s%n%s%n", "標(biāo)題", "-".repeat(20))
+ String.format("值: %.2f", 123.456);6.2 自定義格式化
// 自定義對(duì)象格式化
class Product {
String name;
double price;
@Override
public String toString() {
return String.format("商品[%s] 價(jià)格:¥%.2f", name, price);
}
}
Product p = new Product();
p.name = "手機(jī)"; p.price = 2999.99;
String.format("%s", p); // "商品[手機(jī)] 價(jià)格:¥2999.99"6.3 常見(jiàn)模式模板
public class FormatPatterns {
// 文件名序號(hào)格式化
public static String formatFileIndex(int index) {
return String.format("file_%04d.txt", index); // file_0001.txt
}
// 時(shí)間間隔格式化
public static String formatDuration(long millis) {
long hours = millis / 3600000;
long minutes = (millis % 3600000) / 60000;
long seconds = (millis % 60000) / 1000;
return String.format("%02d:%02d:%02d", hours, minutes, seconds);
}
// 進(jìn)度條顯示
public static String formatProgress(double current, double total) {
double percent = (current / total) * 100;
return String.format("[%-50s] %.1f%%",
"=".repeat((int)(percent / 2)), percent);
}
}七、總結(jié)速查表
| 需求 | 格式字符串 | 示例 |
|---|---|---|
| 保留2位小數(shù) | "%.2f" | 3.14159 → "3.14" |
| 寬度10,右對(duì)齊 | "%10s" | "test" → " test" |
| 寬度10,左對(duì)齊 | "%-10s" | "test" → "test " |
| 補(bǔ)零到5位 | "%05d" | 42 → "00042" |
| 千位分隔符 | "%,d" | 1000000 → "1,000,000" |
| 十六進(jìn)制 | "%x" | 255 → "ff" |
| 科學(xué)計(jì)數(shù)法 | "%e" | 1000 → "1.000000e+03" |
| 多參數(shù)重用 | "%1$s %1$s" | "A", "B" → "A A" |
| 日期時(shí)間 | "%tF %tT" | → "2024-01-15 14:30:25" |
最佳實(shí)踐建議:
- 明確需求:先確定需要什么格式(小數(shù)位、對(duì)齊、千分位等)
- 測(cè)試邊界:測(cè)試0、負(fù)數(shù)、大數(shù)值等特殊情況
- 考慮本地化:如果是國(guó)際化應(yīng)用,使用Locale參數(shù)
- 性能考慮:大量格式化時(shí)考慮使用StringBuilder或Formatter
- 可讀性優(yōu)先:復(fù)雜的格式化考慮拆分成多行
String.format() 是Java中非常強(qiáng)大的工具,掌握它可以讓你在處理字符串輸出時(shí)事半功倍。從簡(jiǎn)單的數(shù)字格式化到復(fù)雜的報(bào)表生成,這個(gè)工具都能勝任。
到此這篇關(guān)于Java 格式化輸出String.format() 詳解的文章就介紹到這了,更多相關(guān)Java String.format() 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實(shí)現(xiàn)簡(jiǎn)單猜數(shù)字
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單猜數(shù)字,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05
java商城項(xiàng)目實(shí)戰(zhàn)之購(gòu)物車(chē)功能實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了java商城項(xiàng)目實(shí)戰(zhàn)之購(gòu)物車(chē)功能實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
梳理總結(jié)Java?static關(guān)鍵字的方法作用
這篇文章主要介紹了梳理總結(jié)Java?static關(guān)鍵字的方法作用,?static?關(guān)鍵字可以用來(lái)修飾的成員變量和成員方法,被修飾的成員是屬于類(lèi)的,而不是單單是屬于某個(gè)對(duì)象的2022-06-06
Java雜談之如何優(yōu)化寫(xiě)出漂亮高效的代碼
不一致的代碼會(huì)造成認(rèn)知上的負(fù)擔(dān),在一個(gè)系統(tǒng)中,做類(lèi)似的事情,卻有不同的做法,或者起到類(lèi)似作用的事物,卻有不同的名字,讓人困惑2021-09-09
SpringBoot中處理JSON的三大庫(kù)應(yīng)用全指南
在 Spring Boot 開(kāi)發(fā)中,JSON 作為數(shù)據(jù)交互的通用格式,其處理效率與準(zhǔn)確性直接影響系統(tǒng)性能與用戶體驗(yàn),本文將全面對(duì)比SpringBoot處理JSON三大庫(kù)的特性,希望對(duì)大家有所幫助2025-07-07
Java常用HASH算法總結(jié)【經(jīng)典實(shí)例】
這篇文章主要介紹了Java常用HASH算法,結(jié)合實(shí)例形式總結(jié)分析了Java常用的Hash算法,包括加法hash、旋轉(zhuǎn)hash、FNV算法、RS算法hash、PJW算法、ELF算法、BKDR算法、SDBM算法、DJB算法、DEK算法、AP算法等,需要的朋友可以參考下2017-09-09
Java動(dòng)態(tài)批量生成logback日志文件的示例
本文主要介紹了Java動(dòng)態(tài)批量生成logback日志文件的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04
AJAX省市區(qū)三級(jí)聯(lián)動(dòng)下拉菜單(java版)
這篇文章主要介紹了AJAX省市區(qū)三級(jí)聯(lián)動(dòng)下拉菜單(java版)的相關(guān)資料,需要的朋友可以參考下2016-01-01

