格式化字串進階
本集目標
學會 println! 的各種格式化技巧,包括變數捕獲簡寫、寬度、精度控制、對齊和進位制顯示。
本集是第二章的補充。
概念說明
我們之前一直用 println!("{}", x) 來印東西,但其實 Rust 的格式化字串功能強大得多。這集介紹最常用的技巧,但不會涵蓋所有用法——完整的格式化語法請參考官方文件。
變數捕獲簡寫
你可以直接在 {} 裡寫變數名稱:
fn main() {
let name = "Andy";
println!("{name}"); // 等同於 println!("{}", name)
}
這比一直寫 {} 然後在後面對應變數方便多了,尤其是有很多變數的時候。注意只能放變數名,不能放表達式("{x + 1}" 不行)。
小數精度
用 :.N 控制小數點後幾位:
fn main() {
let pi = 3.14159265;
println!("{pi:.2}"); // 印出 3.14
}
寬度
用 :N 指定最小寬度——不夠寬的話會用空白補齊:
fn main() {
let x = 42;
println!("{x:5}"); // " 42"(寬度 5,靠右,空白補齊)
}
對齊
用 :>N、:<N、:^N 來明確控制靠右、靠左、置中:
fn main() {
let name = "Andy";
println!("[{name:>10}]"); // 靠右對齊,寬度 10
println!("[{name:<10}]"); // 靠左對齊
println!("[{name:^10}]"); // 置中
}
填充字元
預設用空白填充,你也可以指定其他字元:
fn main() {
let id = 42;
println!("{id:0>5}"); // 印出 00042(用 0 填充)
}
進位制顯示
用 :b、:x、:o 分別以二進位、十六進位、八進位顯示數字:
fn main() {
let n = 255;
println!("{n:b}"); // 11111111
println!("{n:x}"); // ff
println!("{n:o}"); // 377
}
這些格式也可以組合——例如 {:0>8b} 是「零填充到 8 位的二進位」。
跳脫大括號
如果你想在格式化字串裡印出 { 或 } 本身,用 {{ 和 }}:
fn main() {
println!("這是大括號:{{}}"); // 印出:這是大括號:{}
}
範例程式碼
fn main() {
let name = "小明";
let score = 87.5678;
// 變數捕獲簡寫
println!("學生:{name}");
println!("分數:{score}");
// 小數精度
println!("四捨五入到兩位:{score:.2}");
// 寬度
println!("[{name:10}]"); // 字串預設靠左
let x = 42;
println!("[{x:10}]"); // 數字預設靠右
// 對齊
println!("[{name:>10}]"); // 靠右
println!("[{name:<10}]"); // 靠左
println!("[{name:^10}]"); // 置中
// 零填充
let id = 42;
println!("編號:{id:0>5}");
// 進位制顯示
let value = 255;
println!("十進位:{value}");
println!("二進位:{value:b}");
println!("十六進位:{value:x}");
println!("八進位:{value:o}");
// 組合技:零填充 + 靠右 + 2 位寬 + 十六進位
let byte = 10;
println!("0x{byte:0>2x}"); // 印出 0x0a
// 組合技:零填充 + 靠右 + 8 位寬 + 二進位
println!("{byte:0>8b}"); // 印出 00001010
// 如果要印出大括號本身,用 {{ 和 }}
println!("這是一個大括號:{{}}"); // 印出:這是一個大括號:{}
}
重點整理
println!("{x}")直接在大括號裡寫變數名,只能放變數不能放表達式{:.2}控制小數點後位數{:5}指定最小寬度{:>10}、{:<10}、{:^10}分別是靠右、靠左、置中對齊{:0>5}用0填充到寬度 5{:b}、{:x}、{:o}分別用二進位、十六進位、八進位顯示- 格式化選項可以組合使用,例如
{:0>8b}是零填充 + 靠右 + 8 位寬 + 二進位 - 要印出
{和}本身,用{{和}}跳脫