格式化打印

format!:将格式化文本写入 String print!:与 format! 类似,但文本会打印到控制台(io::stdout) println!:与 print! 类似,但会在末尾添加换行符 eprint!:与 print! 类似,但文本会打印到标准错误输出(io::stderr) eprintln!:与 eprint! 类似,但会在末尾添加换行符

常规println打印是没问题,例如{}、{number}、{number:>width$}、{number:>5}等常规

fn main(){
println!("Hello, world!");
println!("今天是{0},天气{1},温度{2}度","周二","晴朗","10");
println!("{user} play {game}",user="me" ,game="my game");
println!("十进制 8={}",8);
println!("二进制 8={:b}",8);
println!("八进制 8={:o}",8);
println!("十六进制 8={:x}",8);
println!("空格填充,{number:>5}",number=1);
println!("数字填充,{number:0>5}",number=1);
println!("数字填充,{number:0>with$}",number=1,with=8);
}

但是还有一种特使形式是使用format占位,例如format!("{1} {} {0} {}", 1, 2)

隐式占位符 {} 的索引分配与显式索引 {0}/{1} 互不干扰,且隐式占位符按自身出现顺序独立分配索引(从 0 开始连续计数)。

占位符位置类型如何确定参数索引实际取值说明
{1}显式索引直接指定索引 12取第二个参数
{}隐式第一个隐式占位符 → 索引 01隐式序列独立计数,与前面的 {1} 无关
{0}显式索引直接指定索引 01取第一个参数
{}隐式第二个隐式占位符 → 索引 12隐式序列继续计数
  • 显式索引 {n} → 直接取参数列表中索引 n 的值(可重复使用,如 {0} 出现两次)。

  • 隐式占位符 {} → 按自身在格式字符串中出现的顺序,依次分配索引 0, 1, 2… → 分配过程完全独立于显式索引(显式索引用了 {1} 不会影响第一个 {} 取索引 0)。

format!("{1} {}", 10, 20); // "20 10" → {} 是第一个隐式 → 索引0=10
format!("{} {0}", 10, 20); // "10 10" → {} 取索引0, {0} 也取索引0
format!("{0} {1} {} {}", 1,2); // "1 2 1 2" → 两个 {} 分别取索引0和1

fmt相关知识 fmt

练习:Pi 约等于 3.142,通过控制显示的小数位数来实现。

let pi = 3.14;
println!("pi={0:.3}",pi);