Rust文件大小格式化库human-size的使用,human-size可智能转换字节数为易读的KB/MB/GB/TB单位
Rust文件大小格式化库human-size的使用
human-size是一个用于智能转换字节数为易读的KB/MB/GB/TB单位的Rust库。
安装
在Cargo.toml中添加依赖:
human-size = "0.4.3"
或者运行命令:
cargo add human-size
使用示例
use human_size::{Size, Multiple, Binary};
fn main() {
// 将字节数转换为易读格式
let size = Size::new(1024.0, Binary::Bytes).unwrap();
println!("{}", size.to_string()); // 输出 "1 KiB"
// 从字节数直接创建
let size = Size::from_bytes(1500000.0).unwrap();
println!("{}", size.to_string()); // 输出 "1.43 MiB"
// 使用不同的单位系统
let size = Size::new(1000.0, Multiple::Decimal).unwrap();
println!("{}", size.to_string()); // 输出 "1 KB"
// 自定义精度
let size = Size::new(123456789.0, Binary::Bytes).unwrap();
println!("{:.2}", size.to_string()); // 输出 "117.74 MiB"
}
完整示例
use human_size::{Size, Multiple, Binary};
fn format_file_size(bytes: u64) -> String {
Size::from_bytes(bytes as f64)
.unwrap()
.to_string()
}
fn main() {
let sizes = [
42, // 42字节
1024, // 1 KiB
1048576, // 1 MiB
1073741824, // 1 GiB
1099511627776 // 1 TiB
];
for size in sizes {
println!("{} bytes = {}", size, format_file_size(size));
}
// 自定义单位
let custom_size = Size::new(1500.0, Multiple::Decimal).unwrap();
println!("1500 bytes in decimal units: {}", custom_size);
}
这个库提供了简单易用的API来将原始字节数转换为更易读的文件大小格式,支持二进制(IEC)和十进制(SI)两种单位系统。
1 回复
Rust文件大小格式化库human-size使用指南
human-size
是一个Rust库,用于将字节大小转换为人类可读的格式(如KB、MB、GB等),它会自动选择最合适的单位。
安装
在Cargo.toml
中添加依赖:
[dependencies]
human-size = "0.4"
基本用法
use human_size::{Size, SpecificSize, Multiple, Kilobyte, Megabyte, Gigabyte};
fn main() {
// 自动选择最合适的单位
let size = Size::from_bytes(1500).to_string();
println!("{}", size); // 输出: "1.5 KB"
// 指定特定单位
let specific = SpecificSize::new(1.5, Megabyte).unwrap();
println!("{}", specific); // 输出: "1.5 MB"
}
主要功能
1. 自动转换
let sizes = [
500, // 500 B
1500, // 1.5 KB
1_500_000, // 1.5 MB
1_500_000_000 // 1.5 GB
];
for bytes in sizes {
println!("{}", Size::from_bytes(bytes));
}
2. 自定义单位
use human_size::{SpecificSize, Kilobyte};
let size = SpecificSize::new(2.5, Kilobyte).unwrap();
println!("{}", size); // 2.5 KB
3. 自定义精度
let size = Size::from_bytes(1555);
println!("{:.1}", size); // "1.5 KB"
println!("{:.3}", size); // "1.555 KB"
4. 解析字符串
use human_size::ParsingError;
let size: Result<SpecificSize<Multiple>, ParsingError> = "1.5 MB".parse();
match size {
Ok(s) => println!("Parsed size: {} bytes", s.to_bytes()),
Err(e) => println!("Error parsing: {}", e),
}
5. 数学运算
let size1 = SpecificSize::new(1.0, Megabyte).unwrap();
let size2 = SpecificSize::new(500.0, Kilobyte).unwrap();
let sum = size1 + size2;
println!("{}", sum); // "1.5 MB"
高级用法
自定义单位系统
use human_size::{Multiple, CustomUnits};
#[derive(Debug, Clone, Copy)]
enum MyUnits {
Bytes,
Blocks,
}
impl CustomUnits for MyUnits {
fn base_unit(&self) -> Self {
MyUnits::Bytes
}
fn ratio(&self) -> f64 {
match self {
MyUnits::Bytes => 1.0,
MyUnits::Blocks => 512.0, // 假设1块=512字节
}
}
fn identifier(&self) -> &'static str {
match self {
MyUnits::Bytes => "B",
MyUnits::Blocks => "blks",
}
}
}
fn main() {
let size = SpecificSize::new(1024.0, MyUnits::Blocks).unwrap();
println!("{}", size); // 输出: "1024 blks"
println!("{} bytes", size.to_bytes()); // 输出: "524288 bytes"
}
完整示例Demo
下面是一个综合使用human-size库的完整示例:
use human_size::{
Size, SpecificSize, Multiple,
Kilobyte, Megabyte, Gigabyte,
CustomUnits, ParsingError
};
// 自定义单位系统
#[derive(Debug, Clone, Copy)]
enum CustomUnit {
Bytes,
Sectors,
}
impl CustomUnits for CustomUnit {
fn base_unit(&self) -> Self {
CustomUnit::Bytes
}
fn ratio(&self) -> f64 {
match self {
CustomUnit::Bytes => 1.0,
CustomUnit::Sectors => 4096.0, // 假设1扇区=4096字节
}
}
fn identifier(&self) -> &'static str {
match self {
CustomUnit::Bytes => "B",
CustomUnit::Sectors => "sectors",
}
}
}
fn main() {
// 1. 自动转换示例
println!("--- 自动转换示例 ---");
let auto_sizes = [500, 1500, 1_500_000, 1_500_000_000];
for bytes in auto_sizes {
println!("{}", Size::from_bytes(bytes));
}
// 2. 指定单位示例
println!("\n--- 指定单位示例 ---");
let kb_size = SpecificSize::new(2.5, Kilobyte).unwrap();
let mb_size = SpecificSize::new(1.2, Megabyte).unwrap();
println!("KB: {}, MB: {}", kb_size, mb_size);
// 3. 自定义精度示例
println!("\n--- 自定义精度示例 ---");
let precise_size = Size::from_bytes(1555555);
println!("默认: {}", precise_size);
println!("1位小数: {:.1}", precise_size);
println!("3位小数: {:.3}", precise_size);
// 4. 字符串解析示例
println!("\n--- 字符串解析示例 ---");
match "2.7 GB".parse::<SpecificSize<Multiple>>() {
Ok(s) => println!("解析成功: {} = {} bytes", s, s.to_bytes()),
Err(e) => println!("解析错误: {}", e),
}
// 5. 数学运算示例
println!("\n--- 数学运算示例 ---");
let size1 = SpecificSize::new(1.0, Megabyte).unwrap();
let size2 = SpecificSize::new(500.0, Kilobyte).unwrap();
println!("{} + {} = {}", size1, size2, size1 + size2);
// 6. 自定义单位系统示例
println!("\n--- 自定义单位系统示例 ---");
let sector_size = SpecificSize::new(8.0, CustomUnit::Sectors).unwrap();
println!("{} = {} bytes", sector_size, sector_size.to_bytes());
}
注意事项
- 当使用
SpecificSize
时,如果值对于所选单位无效(如负数),new
会返回None
- 默认使用二进制前缀(KiB、MiB等),如果需要十进制前缀(KB、MB等),可以使用
Multiple
和Decimal
枚举 - 格式化输出时可以使用Rust的标准格式化语法控制小数位数
这个库非常适合需要显示文件大小、内存使用情况等场景,能自动选择最合适的单位使显示更友好。