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 数学
1,505,358 个月下载量
在 2,513 个 Crates 中使用 (42 直接)
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的幂次,使用二进制前缀可以更准确地表示数据量。
前缀名称
如果您需要用实际文字来描述您的单位,而不仅仅是符号,请使用upper
、caps
、lower
或symbol
之一,这些会以各种格式输出前缀。例如
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
。
目前,唯一支持的单位是字节(b
和B
),以及米(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)));