15.4 - 格式化值
-
格式化宏:总是借用对其参数的共享引用,不会取得所有权,也不会修改它们。
-
只要实现了
std::fmt模块的格式化特型,就可以扩展下述宏,以支持自定义类型:
format!:使用模板来构建String。println!和print!:将格式化后的文本写入标准输出流。writeln!和write!:将格式化后的文本写入指定输出流。panic!:使用模板构建一个终止诧异的表达式,可以包含自定义的信息。format_args!宏和std::fmt::Arguments类型:可以写出自定义的支持格式化语言的函数和宏。
-
模板中的每个
{},都会被后面某个参数的格式化形式取代。模板字符串必须是常量。 -
模板的
{}部分称为格式化形参,形式为
{which:how}。
which和how是可选的。which部分用于选择使用模板后面的哪个参数来填补当前位置。可以通过索引或名称来选择参数。没有which部分的形参会简单地从左往右应用参数。how部分用于指定如何格式化参数:加多少空白、精度和基数多少。如果有how参数,那么前面的冒号是必须的。
| 模板字符串 | 参数列表 | 结果 |
|---|---|---|
"number of {}: {}" |
"elephants", 19 |
"number of elephants: 19" |
"from {1} to {0}" |
"the grave", "the cradle" |
"from the cradle to the grave" |
"v = {:?}" |
vec![0, 1, 2, 5, 12, 29] |
"v = [0, 1, 2, 5, 12, 29]" |
"name = {:?}" |
"Nemo" |
"name = \"Nemo\"" |
{: 8.2} km/s"" |
"11.186" |
" 11.19 km/s" |
"{: 20} {: 02x} {: 02x}" |
"adc #42", 105, 42 |
"adc #42 69 2a" |
"{1:02x} {2:02x} {0}" |
"adc #42", 105, 42 |
"69 2a adc #42" |
"{lsb:02x} {msb:02x} {insn}" |
insn="adc #42", lsb = 105, msb = 42 |
"69 2a adc #42" |
15.4.1 - 格式化文本值
格式化 &str 或 String(char 等同于只有一个字符的字符串)文本类型时,格式化形参 how 部分可以包含如下可选内容:
| 使用的特性 | 模板字符串 | 结果 |
|---|---|---|
| 默认 | "{}" |
"bookends" |
| 最小字段宽度 | "{: 4}" |
"bookends" |
"{: 12}" |
"bookends " |
|
| 文本长度限制 | "{:. 4}" |
"book" |
"{:. 12}" |
"bookends" |
|
| 字段宽度及长度限制 | "{: 12.20}" |
"bookends " |
"{: 4.20}" |
"bookends" |
|
"{: 4.6}" |
"booken" |
|
"{: 6.4}" |
"book " |
|
| 左对齐,字段宽度 | "{: <12}" |
"bookends " |
| 居中对齐,字段宽度 | "{: ^12}" |
" bookends " |
| 右对齐,字段宽度 | "{: >12}" |
" bookends" |
填充 =,居中对齐,字段宽度 |
"{: =^12}" |
"==bookends==" |
填充 *,右对齐,字段宽度,长度限制 |
"{: *>12.4}" |
"********book" |
-
除
&str和String之外,也可以给格式化宏传入引用目标为文本的智能指针类型,比如Rc<String>或Cow<'a, str>。 -
不能直接把文件名路径
std::path::Path传给格式化宏,但可以使用Path的dispaly方法返回的值进行格式化。println!("processing file: {}", path.display());
15.4.2 - 格式化数值
当格式化参数具有 usize 或 f64 数值类型时,形参 how 的值必须包含,有以下可选组成部分。
- 格式化数值
| 使用的特性 | 模板字符串 | 结果 |
|---|---|---|
| 默认 | "{}" |
"1234" |
| 强制符号 | "{: +}" |
"+1234" |
| 最小字段宽度 | "{: 12}" |
" 1234" |
"{: 2}" |
"1234" |
|
| 符号,宽度 | "{: +12}" |
" +1234" |
| 前置零,宽度 | "{: 012}" |
"000000001234" |
| 符号,前置零,宽度 | "{: +012}" |
"+00000001234" |
| 左对齐,宽度 | "{: <12}" |
"1234 " |
| 居中对齐,宽度 | "{: ^12}" |
" 1234 " |
| 右对齐,宽度 | "{: >12}" |
" 1234" |
| 左对齐,符号,宽度 | "{: <+12}" |
"+1234 " |
| 居中对齐,符号,宽度 | "{: ^+12}" |
" +1234 " |
| 右对齐,符号,宽度 | "{: >+12}" |
" +1234" |
| 填充 =,居中对齐,宽度 | "{: =^12}" |
"====1234====" |
| 二进制计数法 | "{: b}" |
"100110100010" |
| 宽度,八进制计数法 | "{: 12o}" |
" 2322" |
| 符号,宽度,十六进制计数法 | "{: +12x}" |
" +4d2" |
| 符号,宽度,大写十六进制计数法 | "{: +12X}" |
" +4D2" |
| 符号,基数前缀,宽度,十六进制 | "{: +#12x}" |
" +0x4d2" |
| 符号,基数,补零,宽度,十六进制 | "{: +#012x}" |
"+0x0000004d2" |
"{: +#06x}" |
"+0x4d2" |
- 格式化浮点数
| 使用的特性 | 模板字符串 | 结果 |
|---|---|---|
| 默认 | "{}" |
"1234.5678" |
| 精度 | "{:. 2}" |
"1234.57" |
"{:. 6}" |
"1234.567800" |
|
| 最小字段宽度 | "{: 12}" |
" 1234.5678" |
| 宽度,精度 | "{: 12.2}" |
" 1234.57" |
"{: 12.6}" |
" 1234.567800" |
|
| 前置零,宽度,精度 | "{: 012.6}" |
"01234.567800" |
| 科学计数法 | "{: e}" |
"1.234578e3" |
| 科学计数法,精度 | "{: 3e}" |
"1.235e3" |
| 科学计数法,宽度,精度 | "{: 12.3e}" |
" 1.235e3" |
"{: 12.3E}" |
" 1.235E3" |
15.4.3 - 格式化其他类型
- 每种错误类型都应该实现
std::error::Error特型,该特型扩展支持了默认的格式化特型std::fmt::Display。任何实现Error的类型都是可以格式化的。 std::net::IpAddr和std::net::SocketAddr类型:可以格式化互联网协议地址。true和false布尔值:可以直接格式化。
15.4.4 - 为调试格式化值
-
{:?}格式:可以调试和输出日志,也支持格式化任意 Rust 标准库中的公共类型。-
可以用来检查向量、切片、元组、散列表、线程等数百种类型。
-
使用
#[derive(Debug)]语法,可以让自定义类型支持{:?}。#[derive(Copy, Clone, Debug)] struct Complex { r: f64, i: f64 } let third = Complex { r: -0.5, i: f64::sqrt(0.75) }; println!("{:?}", third); // 输出结果 Complex { r: -0.5, i
-

本文介绍Rust语言中的格式化宏及其使用方法,包括格式化文本、数值和其他类型;并详细讲解了正则表达式库的使用,包括构建Regex值、基本用法及规范化处理。
最低0.47元/天 解锁文章
810

被折叠的 条评论
为什么被折叠?



