#numeric

no-std number_prefix

数字前缀(千、兆、KiB)库

12 个版本

使用旧 Rust 2015

0.4.0 2020年4月7日
0.3.0 2019年3月17日
0.2.8 2018年3月10日
0.2.7 2016年10月5日
0.2.0 2014年12月17日

#60 in 数学

Download history 334808/week @ 2024-03-14 349398/week @ 2024-03-21 342489/week @ 2024-03-28 385445/week @ 2024-04-04 354737/week @ 2024-04-11 350741/week @ 2024-04-18 329680/week @ 2024-04-25 336086/week @ 2024-05-02 334556/week @ 2024-05-09 369608/week @ 2024-05-16 354484/week @ 2024-05-23 384025/week @ 2024-05-30 369626/week @ 2024-06-06 378249/week @ 2024-06-13 380342/week @ 2024-06-20 305403/week @ 2024-06-27

1,505,358 个月下载量
2,513 个 Crates 中使用 (42 直接)

MIT 许可证

22KB
292

rust-number-prefix 构建状态

这是一个用于格式化数字的库,带有数字前缀,例如将“3000米”转换为“3公里”,或将“8705字节”转换为“8.5 KiB”。

查看 Rustdoc

安装

这个 crate 与 Cargo 一起工作。将以下内容添加到你的 Cargo.toml 依赖关系部分

[dependencies]
number_prefix = "0.4"

这个 crate 支持 no_std。要激活它,禁用 std Cargo 功能。

此 crate 测试的第一个 Rust 版本是 Rust v1.31.0

使用

函数 NumberPrefix::decimal 返回一个结果数字和其前缀的配对,或者一个通知,说明数字太小,无法应用任何前缀。例如

use number_prefix::NumberPrefix;

let amount = 8542_f32;
let result = match NumberPrefix::decimal(amount) {
    NumberPrefix::Standalone(bytes) => {
        format!("The file is {} bytes in size", bytes)
    }
    NumberPrefix::Prefixed(prefix, n) => {
        format!("The file is {:.1} {}B in size", n, prefix)
    }
};

assert_eq!("The file is 8.5 kB in size", result);

格式化字符串中的 {:.1} 部分告诉它将输出限制为仅一位小数。该值通过反复将数字除以1000,直到它小于该值来计算,在这种情况下结果为8.542,向下取整。因为只需要进行一次除法,所以函数还返回十进制前缀 Kilo,它在格式化为字符串时转换为国际认可的符号。

如果值太小,无法应用任何前缀(在这种情况下,如果它小于1000)则返回独立值

use number_prefix::NumberPrefix;

let amount = 705_f32;
let result = match NumberPrefix::decimal(amount) {
    NumberPrefix::Standalone(bytes) => {
        format!("The file is {} bytes in size", bytes)
    }
    NumberPrefix::Prefixed(prefix, n) => {
        format!("The file is {:.1} {}B in size", n, prefix)
    }
};

assert_eq!("The file is 705 bytes in size", result);

在这个特定的例子中,用户期望字节和千字节有不同的格式化:对于带前缀的值,精度更高,但对于仅字节的量,使用任何非整数都没有意义。这就是为什么函数会注意没有前缀的值——它们通常需要特殊处理。

二进制前缀

这个库还允许您使用二进制前缀,它使用数字1024(210)作为乘数,而不是更常见的1000(103)。这使用NumberPrefix::binary函数。例如

use number_prefix::NumberPrefix;

let amount = 8542_f32;
let result = match NumberPrefix::binary(amount) {
    NumberPrefix::Standalone(bytes) => {
        format!("The file is {} bytes in size", bytes)
    }
    NumberPrefix::Prefixed(prefix, n) => {
        format!("The file is {:.1} {}B in size", n, prefix)
    }
};

assert_eq!("The file is 8.3 KiB in size", result);

千字节稍微大于千字节,所以结果中的数字更小;但除此之外,它的工作方式完全相同,二进制前缀会自动转换为符号。

我应该使用哪种前缀?

这个问题没有正确答案!当前的做法是,对于字节等数字使用二进制前缀,而对于其他所有内容仍使用十进制前缀。计算机使用的是2的幂次而不是10的幂次,使用二进制前缀可以更准确地表示数据量。

前缀名称

如果您需要用实际文字来描述您的单位,而不仅仅是符号,请使用uppercapslowersymbol之一,这些会以各种格式输出前缀。例如

use number_prefix::NumberPrefix;

let amount = 8542_f32;
let result = match NumberPrefix::decimal(amount) {
    NumberPrefix::Standalone(bytes) => {
        format!("The file is {} bytes in size", bytes)
    }
    NumberPrefix::Prefixed(prefix, n) => {
        format!("The file is {:.1} {}bytes in size", n, prefix.lower())
    }
};

assert_eq!("The file is 8.5 kilobytes in size", result);

字符串解析

NumberPrefix实现了一个FromStr,它可以解析包含数字和后缀的字符串,例如7.5E

目前,唯一支持的单位是字节(bB),以及米(m)。数字和字符串的其他部分之间允许有空格。

use number_prefix::{NumberPrefix, Prefix};

assert_eq!("7.05E".parse::<NumberPrefix<_>>(),
           Ok(NumberPrefix::Prefixed(Prefix::Exa, 7.05_f64)));

assert_eq!("7.05".parse::<NumberPrefix<_>>(),
           Ok(NumberPrefix::Standalone(7.05_f64)));

assert_eq!("7.05 GiB".parse::<NumberPrefix<_>>(),
           Ok(NumberPrefix::Prefixed(Prefix::Gibi, 7.05_f64)));

无运行时依赖

功能