Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

格式化字串進階

本集目標

學會 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 位寬 + 二進位
  • 要印出 {} 本身,用 {{}} 跳脫