CodeGym /課程 /JAVA 25 SELF /字串格式化

字串格式化

JAVA 25 SELF
等級 9 , 課堂 2
開放

1. 手動串接的問題

若只需要輸出一兩個變數,運算子 + 的確很方便。但當資料很多時,串接很快就會變得混亂,特別是在需要數字格式(例如小數點後 2 位)或換行時。

String name = "奧列格";
int age = 25;
double balance = 12345.67;

System.out.println("姓名: " + name + ", 年齡: " + age + ", 餘額: " + balance + " 歐元。");

嘗試在串接中「硬加」格式化只會讓可讀性更差:

System.out.println("姓名: " + name + ", 年齡: " + age + ", 餘額: " + String.format("%.2f", balance) + " 歐元。");

結論:簡單串接適合小事,但要組合複雜的訊息時,需要更強大的工具 — String.format()

2. String.format — 進階字串格式化

方法 String.format() 可依樣板建立字串,並把值填入指定位置。

一般用法:

String result = String.format("樣板", znacheniya);
  • %s — 字串
  • %d — 整數
  • %f — 浮點數
  • %n — 換行(跨平台)
String name = "奧列格";
int age = 25;
double balance = 12345.6789;

String info = String.format("姓名: %s, 年齡: %d, 餘額: %.2f 歐元。", name, age, balance);
System.out.println(info);
// 將輸出: 姓名: 奧列格, 年齡: 25, 餘額: 12345.68 歐元。

String result = String.format("姓名: %s, 年齡: %d, 餘額: %.2f 歐元", name, age, balance);
// %s — 字串,%d — 整數,%.2f — 小數點後 2 位

數值與字串的格式化

固定小數位的浮點數:

double price = 99.999;
System.out.println(String.format("價格: %.2f 歐元。", price)); // 價格: 100.00 歐元。

欄寬與對齊:

int n = 7;
System.out.println(String.format("數字: [%5d]", n));   // 數字: [    7]
System.out.println(String.format("數字: [%-5d]", n));  // 數字: [7    ]

[5d] — 欄寬 5,預設為靠右對齊;
[-5d] — 欄寬 5,向左對齊。

字串對齊:

String text = "Java";
System.out.println(String.format("[%10s]", text));  // [      Java]
System.out.println(String.format("[%-10s]", text)); // [Java      ]

百分比:

double percent = 0.125;
System.out.println(String.format("完成: %.1f%%", percent * 100)); // 完成: 12.5%

若要輸出百分比符號,請使用 %%

日期格式化(簡述)

import java.util.Date;
Date now = new Date();
System.out.println(String.format("今天: %tD", now)); // 今天: 06/18/24
System.out.println(String.format("時間: %tT", now));   // 時間: 15:42:07

在地化與分隔符

預設會使用系統的 Locale。若要指定自己的(例如用逗號作為小數分隔符),請傳入 Locale——例如 Locale.FRANCE

import java.util.Locale;
double price = 1234.56;
System.out.println(String.format(Locale.FRANCE, "%.2f", price)); // 1234,56

實用範例

範例 1:簡短報告

String name = "安娜";
int tasks = 5;
double hours = 12.3456;

String report = String.format(
    "員工: %s%n完成的任務: %d%n花費的時間: %.1f",
    name, tasks, hours
);
System.out.println(report);

/* 輸出:
員工: 安娜
完成的任務: 5
花費的時間: 12.3
*/

範例 2:具有對齊的表格

String header = String.format("%-10s | %5s | %8s", "姓名", "分數", "時間");
String row1 = String.format("%-10s | %5d | %8.2f", "奧列格", 95, 10.5);
String row2 = String.format("%-10s | %5d | %8.2f", "安娜", 100, 9.75);

System.out.println(header);
System.out.println(row1);
System.out.println(row2);

/* 輸出:
姓名        |  分數 |      時間
奧列格      |    95 |    10.50
安娜        |   100 |     9.75
*/

範例 3:混合文字

int apples = 12;
int pears = 8;
System.out.println(String.format("我有 %d 個蘋果和 %d 個梨。", apples, pears));

3. 實作:在我們的應用中進行字串格式化

把格式化加入主控台應用:餘額一律顯示兩位小數,換行使用 %n

Scanner console = new Scanner(System.in);

System.out.print("請輸入姓名: ");
String name = console.nextLine();

System.out.print("請輸入年齡: ");
int age = console.nextInt();

System.out.print("請輸入餘額: ");
double balance = console.nextDouble();

// 格式化輸出
String info = String.format("姓名: %s, 年齡: %d, 餘額: %.2f 歐元。", name, age, balance);
System.out.println(info);

試試看:

  • 輸入各種不同的值,確認餘額一律以兩位小數顯示(%.2f)。
  • 修改樣板,使用 %n 加上換行。

4. 字串格式化的常見錯誤

錯誤 1:型別與標記不相符。
不能將字串放到 %d,或把數字放到 %s

String.format("年齡: %d", "二十"); // 錯誤:預期為數字,卻傳入了字串

錯誤 2:引數順序搞錯。
樣板是 %s %d,卻先傳數字再傳字串——會拋出錯誤或得到錯誤的輸出。

錯誤 3:忽略 Locale。
期望以逗號作為小數分隔符,卻看到的是點號——請在第一個參數中明確指定所需的 Locale 給 String.format(...)

錯誤 4:未逸出百分比符號。
如果要輸出符號 %,請使用 %%,否則格式化會因錯誤而失敗。

1
任務
JAVA 25 SELF, 等級 9, 課堂 2
上鎖
格式化輸出姓名與年齡
格式化輸出姓名與年齡
1
任務
JAVA 25 SELF, 等級 9, 課堂 2
上鎖
浮點數格式化
浮點數格式化
1
任務
JAVA 25 SELF, 等級 9, 課堂 2
上鎖
表格對齊格式化
表格對齊格式化
1
任務
JAVA 25 SELF, 等級 9, 課堂 2
上鎖
使用區域設定格式化百分比報告
使用區域設定格式化百分比報告
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION