Rust格式化输出用法汇总

server/2024/12/15 10:54:35/

文章目录


Rust的格式化输出是通过std::fmt模块提供的强大功能来实现的。Rust提供了灵活且功能强大的格式化字符串语法,允许开发者根据需求输出不同类型的数据。

基本的格式化输出

Rust中最常用的格式化输出方法是使用println!和format!宏。这些宏通过std::fmt::Display和std::fmt::Debug trait来控制输出的格式。
print!将格式化文本输出到标准输出,不带换行符
println!同上,但是在行的末尾添加换行符
format!将格式化文本输出到String字符串

1.使用println!宏

rust">let name = "Alice";
let age = 30;
//{} 是占位符,它会被后续传入的变量name和age替换  
println!("Hello, my name is {} and I am {} years old.", name, age); 

使用format!宏
format!用法与println!类似,不过它返回一个格式化的String而不是直接输出
format!宏在生成字符串时很有用,特别是当你需要在多个地方使用格式化字符串时。

rust">let name = "Alice";
let age = 30;
let message = format!("Hello, my name is {} and I am {} years old.", name, age);
println!("{}", message);

格式化占位符

Rust的格式化占位符{}有多种变体,用于处理不同的数据类型和输出需求。

1.默认显示格式:{}
{}是最常见的占位符,适用于实现了Display trait的类型,比如字符串和大多数数值类型。

rust">let x = 10;
println!("The value of x is {}", x);

2.调试格式{:?} 和 {:#?}
对于Debug trait类型的变量使用{:?}来打印它们的调试信息。例如结构体、枚举和集合类型通常需要Debug trait来实现。

rust">#[derive(Debug)]
struct Point {x: i32,y: i32,
}let p = Point { x: 1, y: 2 };
println!("Debug output: {:?}", p);

{:#?}会以更具可读性的格式打印数据(通常用于打印集合和结构体等复杂类型)

rust">println!("Pretty Debug: {:#?}", p);

3.自定义格式{:<width}、{:>width}和{:^width}
{:<width}:左对齐
{:>width}:右对齐
{:^width}:居中对齐

rust">//填充对齐
fn main() {// 以下全部都会补齐5个字符的长度// 左对齐 => Hello x    !println!("Hello {:<5}!", "x");// 右对齐 => Hello     x!println!("Hello {:>5}!", "x");// 居中对齐 => Hello   x  !println!("Hello {:^5}!", "x");// 对齐并使用指定符号填充 => Hello x&&&&!// 指定符号填充的前提条件是必须有对齐字符println!("Hello {:&<5}!", "x");
}

4.指定精度 {:.precision}
对于浮点数,可以使用 {:.precision} 来控制小数点后的位数。

rust">let pi = 3.141592653589793;
println!("Pi with 2 decimals: {:.2}", pi); // 输出:3.14//精度可以用于控制浮点数的精度或者字符串的长度  
fn main() {let v = 3.1415926;//保留小数点后两位 => 3.14println!("{:.2}", v);//带符号保留小数点后两位 => +3.14println!("{:+.2}", v);//不带小数 => 3println!("{:.0}", v);//通过参数来设定精度 => 3.1416,相当于{:.4}println!("{:.1$}", v, 4);let s = "hi我是Sunface飞飞";//保留字符串前三个字符 => hi我println!("{:.3}", s);//{:.*}接收两个参数,第一个是精度,第二个是被格式化的值 => Hello abc!println!("Hello {:.*}!", 3, "abcdefg");
}

5.带符号的格式 {:+}和{:0>width}
{:+}: 如果值是正数,显示+符号
{:0>width}: 数字宽度不足时,用0填充 右对齐。

rust">//固定符号填充 
fn main() {// 宽度是5 => Hello     5!println!("Hello {:5}!", 5);// 显式的输出正号 => Hello +5!println!("Hello {:+}!", 5);// 宽度5,使用0进行填充 => Hello 00005!println!("Hello {:05}!", 5);// 负号也要占用一位宽度 => Hello -0005!println!("Hello {:05}!", -5);
}

6.十六进制、二进制、八进制格式:{:x}、{:X}、{:b}、{😮}

rust">//进制
//#b, 二进制
//#o, 八进制
//#x, 小写十六进制
//#X, 大写十六进制
//x, 不带前缀的小写十六进制
fn main() {// 二进制 => 0b11011!println!("{:#b}!", 27);// 八进制 => 0o33!println!("{:#o}!", 27);// 十进制 => 27!println!("{}!", 27);// 小写十六进制 => 0x1b!println!("{:#x}!", 27);// 大写十六进制 => 0x1B!println!("{:#X}!", 27);// 不带前缀的十六进制 => 1b!println!("{:x}!", 27);// 使用0填充二进制,宽度为10 => 0b00011011!println!("{:#010b}!", 27);
}

7.具名参数输出

rust">//{1},表示用第二个参数替换该占位符(索引从 0 开始)
fn main() {println!("{}{}", 1, 2); // =>"12"println!("{1}{0}", 1, 2); // =>"21"println!("{0}, this is {1}. {1}, this is {0}", "Alice", "Bob");}
//具名参数  
//带名称的参数必须放在不带名称参数的后面   
fn main() {println!("{argument}", argument = "test"); // => "test"println!("{name} {}", 1, name = 2); // => "2 1"println!("{a} {c} {b}", a = "a", b = 'b', c = 3); // => "a 3 b"
}

Format 特性

Rust的类型系统允许你定义自己的格式化方式。通过实现std::fmt::Display和std::fmt::Debug特性,自定义格式化输出
1.实现 Display trait

rust">fn main() {use std::fmt;struct Circle {radius: f64,}impl fmt::Display for Circle {fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {write!(f, "Circle with radius {:.2}", self.radius)}}let circle = Circle { radius: 5.0 };//输出: Circle with radius 5.00  println!("{}", circle);
}

2.实现 Debug trait

rust">fn main() {use std::fmt;struct Rectangle {width: u32,height: u32,}impl fmt::Debug for Rectangle {fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {write!(f, "Rectangle {{ width: {}, height: {} }}", self.width, self.height)}}let rect = Rectangle { width: 10, height: 5 };//输出: Rectangle { width: 10, height: 5 }println!("{:?}", rect); 
}

总结

Rust的格式化输出功能非常强大,支持多种数据类型的自定义输出格式。常见的输出宏包括println!和format!,它们结合不同的格式化占位符和数据类型可以满足大多数输出需求。
使用 {} 进行简单的输出
使用 {:?} 或 {:#?} 输出调试信息。
格式化选项如 {:width}, {:.precision}, {:+}, {:x} 等提供了灵活的输出控制。
通过实现 Display 或 Debug trait,你可以为自定义类型提供格式化输出


http://www.ppmy.cn/server/150335.html

相关文章

PDFMathTranslate,PDF多语言翻译,批量处理,学术论文,双语对照(WIN/MAC)

分享一个非常实用的PDF文档翻译项目——PDFMathTranslate。作为一个经常逛GitHub的开发者&#xff0c;我总喜欢翻看各种项目附带的论文&#xff0c;虽然大多时候是瞎研究&#xff0c;但却乐在其中。该项目能够完美保留公式、图表、目录和注释&#xff0c;对于需要阅读外文文献的…

科研绘图系列:R语言绘制网络图和密度分布图(network density plot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载图1图2图3图4图5图6图7图8系统信息参考介绍 R语言绘制网络图和密度分布图(network & density plot) 加载R包 library(magrittr) library(dplyr) library(…

【Linux】VFS虚拟文件系统介绍

在Linux中&#xff0c;Virtual Filesystem (VFS)&#xff0c;即虚拟文件系统&#xff0c;是一个重要的抽象层&#xff0c;用于统一管理各种不同类型的文件系统&#xff0c;使得用户和应用程序可以以一致的方式访问各种存储介质中的文件和目录。VFS位于系统调用接口和实际文件系…

文件的读写

所涉及到的函数如下&#xff1a;<stdio.h> 读写文件之前要先打开文件&#xff0c;使用完要关闭文件归返空间&#xff1a; fopen 打开 fclose 关闭 返回的是FILE*型&#xff0c;第一个参数是文件的名字&#xff0c;第二个参数是以什么形式打开。 一、写入一个字符…

[Pro Git#3] 远程仓库 | ssh key | .gitignore配置

目录 1. 分布式版本控制系统的概念 2. 实际使用中的“中央服务器” 3. 远程仓库的理解 4. 新建远程仓库 5. 克隆远程仓库 6. 设置SSH Key 实验 一、多用户协作与公钥管理 二、克隆后的本地与远程分支对应 三、向远程仓库推送 四、拉取远程仓库更新 五、配置Git忽略…

React 19 除了 RSC 等新功能,还优化了什么?

提示:记录工作中遇到的需求及解决办法 文章目录 前言01. ref 作为 prop02. Context 作为 provider03. refs 的清理函数04. useDeferredValue 的初始值05. 支持文档元数据06. 支持样式表07. 支持异步脚本08. 支持预加载资源09. 支持自定义元素总结前言 React 19 正式发布,新功…

HQChart使用教程30-K线图如何对接第3方数据42-DRAWTEXTREL,DRAWTEXTABS数据结构

HQChart使用教程30-K线图如何对接第3方数据42-DRAWTEXTREL,DRAWTEXTABS数据结构 效果图DRAWTEXTREL示例数据结构说明nametypecolorDrawVAlignDrawAlignDrawDrawTypeDrawDataFont DRAWTEXTABS示例数据结构说明nametypecolorDrawVAlignDrawAlignDrawDrawTypeDrawDataFont 效果图 …

Python课设-谁为影狂-豆瓣数据【数据获取与预处理课设】

&#x1f3c6; 作者简介&#xff1a;席万里 ⚡ 个人网站&#xff1a;https://dahua.bloggo.chat/ ✍️ 一名后端开发小趴菜&#xff0c;同时略懂Vue与React前端技术&#xff0c;也了解一点微信小程序开发。 &#x1f37b; 对计算机充满兴趣&#xff0c;愿意并且希望学习更多的技…