#filesize #file #formatting #string-formatting #prettysize

no-std size

一个用于表达、格式化和与文件大小交互的crate

11个版本

0.5.0-preview22024年4月27日
0.5.0-preview12024年4月26日
0.4.1 2022年10月13日
0.4.0 2022年6月23日
0.1.1 2018年8月16日

#11 in 值格式化

Download history 9486/week @ 2024-04-30 13552/week @ 2024-05-07 11057/week @ 2024-05-14 11043/week @ 2024-05-21 9896/week @ 2024-05-28 11397/week @ 2024-06-04 10682/week @ 2024-06-11 11627/week @ 2024-06-18 10983/week @ 2024-06-25 9924/week @ 2024-07-02 10833/week @ 2024-07-09 8859/week @ 2024-07-16 8688/week @ 2024-07-23 7920/week @ 2024-07-30 11782/week @ 2024-08-06 10057/week @ 2024-08-13

39,954每月下载量
用于46个crate (24直接)

MIT许可

81KB
1.5K SLoC

PrettySize, rust版本

crates.io docs.rs

一个针对Rust应用程序的综合文件大小crate,旨在轻量且高效。包括将文件大小格式化为可读格式以及在不同二进制和十进制大小单位之间转换以及执行强类型文件大小上的数学和逻辑操作的实用程序。

查看crate文档以获取关于此crate能做什么以及如何使用的更完整总结。

功能

PrettySize提供

  • 一个可以用于存储强类型大小(例如let size = Size::from_gigabytes(4))并对其执行操作的类型Size
  • size::consts命名空间中定义了二进制和十进制文件大小单位的定义,既提供简写形式(即consts::KiBconsts::KIBIBYTEconsts::GBconsts::GIGABYTE),
  • Size实现的std::Display,以自动以可读格式显示大小,自动选择最佳大小单位和数值精度以给出最佳结果(您也可以使用Size::to_string()代替)。
  • 一个 Size.format() 方法,它赋予您更多控制如何将大小转换为文本表示形式,允许您指定可读单位的基础和它们的样式(智能、缩写或完整;以及它们的低字母变体)。
  • 对强类型 Size 值进行数学和逻辑运算
  • 完全支持表示负大小(例如,两个大小之间的差异或磁盘上回收的空间量)
  • 将大小序列化为/反序列化为网络负载或其他API请求/响应中的裸字节字段
  • 解析各种格式中的文本表示形式的大小

此crate还可以在 no_std 模式下使用(通过禁用默认功能进行编译)。这禁用了字符串转换/格式化/解析,但保留了所有强类型大小转换和数学/逻辑运算。

此crate没有任何依赖。

用法

Cargo.toml

[dependencies]
size = "0.5.0-preview2"

以及您的代码中

use size::{Base, Size};
// You can use/import consts representing base2/base10 sizes individually
// as (e.g.) size::KiB, or import all with `use size::consts::*`

fn main() {
  // Create strongly-typed sizes:
  let byte_count = Size::from_kilobytes(42);
  assert_eq!(42_000, byte_count.bytes());

  // Use predefined constants for the various units
  let byte_count = 42 * size::KiB;
  assert_eq!(43_008, byte_count);

  // `Size` can take any numeric type you throw at it
  let byte_count = Size::from_mib(0.040055);
  assert_eq!(byte_count.bytes(), 42_000);

  // And for those of you that haven't yet drunk the base-two Kool-Aid:
  let file_size = Size::from_kb(42);
  assert_eq!(file_size.bytes(), 42_000);

  println!("{}, I say!", file_size);
  // prints "41 KiB, I say!"

  // Override the default choice of base-2 units
  println!("{}, I meant!", file_size.format().with_base(Base::Base10));
  // prints "42 KB, I meant!"

  // Add and subtract strongly-typed sizes, even with different underlying types
  let sum = Size::from_mb(1.0) + Size::from_kb(200);
  assert_eq!(sum.bytes(), 1_200_000);

  // Multiply and divide strongly-typed sizes by scalar values
  let new_size = Size::from_mib(2) * 2;
  assert_eq!(new_size, Size::from_mib(4));

  // Compare sizes for equality or order
  let size1 = Size::from_gigabytes(2);
  let size2 = Size::from_gibibytes(1.99);
  assert!(size1 < size2);

  // Parse sizes from textual representations
  let size1 = Size::from_str("12 KiB").unwrap();
  let size2 = Size::from_str("42mb").unwrap();
}

解析和格式化

size crate 支持将文件大小的文本表示形式解析为强类型 Size 对象,通过 Size::from_str() 函数及其 FromStr 实现,允许您调用 "1234 kilobytes".parse()

Size 类型实现了 std::fmt::Display(以及其他许多特质),它提供了一种通过 Size::to_string() 特质的实现或当在 format!(..., Size) 上下文中使用时,生成正确格式化的文件大小文本表示形式的功能。

默认情况下,Size 对象以二进制基础(KiB、MiB等)格式化,具有启发式选择的精度和单位。成员函数 Size::format() 可用于覆盖单位基础(例如,MB与MiB)以及是否使用缩写单位名称(例如,KiB与Kebibyte)。

如果您需要进一步控制格式化(精度、大小写等),请随时在GitHub上打开一个问题或PR!

no_std 使用

将crate添加到 Cargo.toml 中,并禁用 default-features 以支持 no_std

[dependencies]
size = { version = ..., default-features = false }

no_std 模式下构建禁用了浮点 Size 操作/转换以及字符串格式化和转换的支持。

serde 支持

对于序列化和反序列化支持,将 size crate 添加到您的 Cargo.toml 中,并启用 serde 功能

[dependencies]
size = { version = ..., features = [ "serde" ] }

Size 类型是透明序列化和反序列化的。 这意味着它表现得像一个表示字节数的 u64 字段。这样做是为了允许从不表示大小为强类型字段的语言/应用程序直接反序列化网络负载(反之亦然)。

作为一个具体示例,假设您有一个包含 Size 字段的以下结构体

#[derive(Serialize, Deserialize)]
struct File {
    path: PathBuf,
    size: Size,
}

以下使用JSON作为示例,上面的 File 类型将序列化为/反序列化为以下内容

{
    "path:" "/foo/bar",
    "size:" 1024
}

如您所见,size字段已被直接序列化为数值(而不是包含该数值的Size对象)。

从字符串中解析大小

可以使用FromStr实现或静态成员函数Size::from_str()从文本中解析大小,并支持广泛的各种输入格式和表示。

let size1 = Size::from_str("123456").unwrap();
let size2 = Size::from_str("17mib").unwrap();
let size3 = Size::from_str("12.8 KB").unwrap();
let size4 = Size::from_str("18.9 gigabytes").unwrap();

关于

该项目最初是Mahmoud将C#的PrettySize.NET库从C#迁移到Rust。与C#版本的该项目一样,Rust更丰富的enum类型和强大的泛型使得在没有冗余的情况下实现自定义的Size泛型变得可能。其范围自那时以来已经大幅增长。

许可证

PrettySize由NeoSmart Technologies的Mahmoud Al-Qudsi编写和维护,并按照MIT公共许可证的条款向公众发布。

待办事项

本节目前为空 🎉

欢迎提交拉取请求!

依赖项

~170KB