格式化输出
位置参数
1.🌟🌟
1. /* 填空 */
2. fn main() {
3. println!("{0}, this is {1}. {1}, this is {0}", "Alice", "Bob");// => Alice, this is Bob. Bob, this is Alice
4. assert_eq!(format!("{1}{0}", 1, 2), __);
5. assert_eq!(format!(__, 1, 2), "2112");
6. println!("Success!");
7. }
具名参数
2.🌟🌟
1. fn main() {
2. println!("{argument}", argument = "test"); // => "test"
4. /* 填空 */
5. assert_eq!(format!("{name}{}", 1, __), "21");
6. assert_eq!(format!(__,a = "a", b = 'b', c = 3 ), "a 3 b");
8. /* 修复错误 */
9. // 具名参数必须放在其它参数后面
10. println!("{abc} {1}", abc = "def", 2);
12. println!("Success!")
13. }
字符串对齐
3.🌟🌟 默认情况下,通过空格来填充字符串
1. fn main() {
2. // 下面两个都是通过 5 个空格来填充
3. println!("Hello {:5}!", "x"); // => "Hello x !"
4. println!("Hello {:1$}!", "x", 5); // => "Hello x !"
6. /* 填空 */
7. assert_eq!(format!("Hello __!", 5, "x"), "Hello x !");
8. assert_eq!(format!("Hello __!", "x", width = 5), "Hello x !");
10. println!("Success!")
11. }
4.🌟🌟🌟 左对齐, 右对齐, 使用指定的字符填充
1. fn main() {
2. // 左对齐
3. println!("Hello {:<5}!", "x"); // => Hello x !
4. // 右对齐
5. assert_eq!(format!("Hello __!", "x"), "Hello x!");
6. // 居中对齐
7. assert_eq!(format!("Hello __!", "x"), "Hello x !");
9. // 左对齐,并使用 `&` 填充
10. assert_eq!(format!("Hello {:&<5}!", "x"), __);
12. println!("Success!")
13. }
5.🌟🌟 我们还能使用 0 来填充数字
1. fn main() {
2. println!("Hello {:5}!", 5); // => Hello 5!
3. println!("Hello {:+}!", 5); // => Hello +5!
4. println!("Hello {:05}!", 5); // => Hello 00005!
5. println!("Hello {:05}!", -5); // => Hello -0005!
7. /* 填空 */
8. assert!(format!("{number:0>width$}", number=1, width=6) == __);
10. println!("Success!")
11. }
精度
6.🌟🌟 浮点数精度
2. /* 填空 */
3. fn main() {
4. let v = 3.1415926;
6. println!("{:.1$}", v, 4); // same as {:.4} => 3.1416
8. assert_eq!(format!("__", v), "3.14");
9. assert_eq!(format!("__", v), "+3.14");
10. assert_eq!(format!("__", v), "3");
12. println!("Success!")
13. }
7.🌟🌟🌟 字符串长度
1. fn main() {
2. let s = "Hello, world!";
4. println!("{0:.5}", s); // => Hello
6. assert_eq!(format!("Hello __!", 3, "abcdefg"), "Hello abc!");
8. println!("Success!")
9. }
二进制, 八进制, 十六进制
- format!(“{}”, foo) -> “3735928559”
- format!(“0x{:X}”, foo) -> “0xDEADBEEF”
- format!(“0o{:o}”, foo) -> “0o33653337357”
8.🌟🌟
1. fn main() {
2. assert_eq!(format!("__", 27), "0b11011");
3. assert_eq!(format!("__", 27), "0o33");
4. assert_eq!(format!("__", 27), "0x1b");
5. assert_eq!(format!("__", 27), "0x1B");
7. println!("{:x}!", 27); // 没有前缀的十六进制 => 1b
9. println!("{:#010b}", 27); // 使用 0 来填充二进制,宽度为 10 => 0b00011011
11. println!("Success!")
12. }
捕获环境中的值
9.🌟🌟🌟
1. fn get_person() -> String {
2. String::from("sunface")
3. }
5. fn get_format() -> (usize, usize) {
6. (4, 1)
7. }
9. fn main() {
10. let person = get_person();
11. println!("Hello, {person}!");
13. let (width, precision) = get_format();
14. let scores = [("sunface", 99.12), ("jack", 60.34)];
15. /* 让下面的代码输出:
16. sunface: 99.1
17. jack: 60.3
18. */
19. for (name, score) in scores {
20. println!("{name}: __");
21. }
22. }
Others
Example
1. fn main() {
2. // 指数
3. println!("{:2e}", 1000000000); // => 1e9
4. println!("{:2E}", 1000000000); // => 1E9
6. // 指针地址
7. let v= vec![1, 2, 3];
8. println!("{:p}", v.as_ptr()); // => 0x600002324050
10. // 转义
11. println!("Hello {{}}"); // => Hello {}
12. }
你可以在这里找到答案(在 solutions 路径下)
