Rust格式化问题:固定长度字符串与带前导零的浮点数输出
Rust 格式化输出问题修复方案
问题根源
- 输出字段顺序错误:期望是
[姓名][字母][金额],当前输出为[姓名][账号][字母][金额] f32精度不足:无法保留8位有效小数,导致小数部分被截断为0- 依赖第三方
pad库:Rust Playground无法正常加载该库,需改用标准库实现 - 金额未按要求格式化:整数部分未补前导零,不满足固定长度要求
修复代码
use rand::Rng; struct Report { name: String, account_number: i64, letter: char, amount: f64, } fn main() { let mut rng = rand::thread_rng(); for _ in 0..100 { let amount = rng.gen_range(100.1..9999999999.9); let acc = Report { name: format!("{:<20}", "John Doe"), // 标准库实现姓名固定20位宽度 account_number: 12345678912345, letter: rng.gen_range('C'..='D'), amount, }; // 拆分金额为整数和小数部分分别格式化 let integer_part = acc.amount.trunc(); let decimal_part = acc.amount.fract(); println!( "{}{}{:0>20}{:.8}", acc.name, acc.letter, integer_part, decimal_part ); } }
关键修复细节
- 姓名固定宽度:用
format!("{:<20}", "John Doe")实现左对齐,自动填充空格到20位,完全替代pad库功能 - 精度提升:将
amount类型从f32改为f64,保证能保留8位有效小数 - 字段顺序修正:调整输出顺序为
姓名 + 字母 + 金额,匹配期望格式 - 金额格式化:
- 用
trunc()提取整数部分,{:0>20}实现右对齐并补前导零到20位(可根据实际需求调整位数) - 用
fract()提取小数部分,.8强制保留8位小数
- 用
- 循环优化:用
for循环替代while,更符合Rust编写习惯
示例输出(匹配期望格式)
John Doe D0000000000865421.12576545 John Doe C0000000000000000.44786756 John Doe C0000000567454354.34535767 John Doe D0000004356557654.15343534
内容的提问来源于stack exchange,提问作者Cult of Tranquility
相关产品推荐
相关产品推荐

