1个不稳定版本
0.5.0 | 2024年2月17日 |
---|
#1586 in 数学
23KB
376 行
unit-prefix
本项目是未维护的number_prefix crate的分支/延续。
当前最低支持的Rust版本为1.31(与2018版发布同步)。
API文档和用法示例可在docs.rs上找到。
lib.rs
:
这是一个用于格式化数字的库,例如将“3000米”转换为“3千米”,或将“8705字节”转换为“8.5 KiB”。
用法
函数 NumberPrefix::decimal
返回一个结果数字和其前缀的配对,或者一个通知,说明数字太小,无法应用任何前缀。例如
use unit_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 unit_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 unit_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);
KiB(千ibi字节)比KB(千字节)略大,因此结果中的数字更小;除此之外,它的工作方式完全相同,二进制前缀会自动转换为符号。
我应该使用哪种前缀?
这个问题没有正确答案!常见做法是对于字节数使用二进制前缀,而对于其他所有内容仍使用十进制前缀。计算机以2的幂次方而非10的幂次方工作,使用二进制前缀可以更准确地表示数据量。
前缀名称
如果您需要用实际文字而不是符号来描述您的单位,可以使用以下之一:`upper`、`caps`、`lower`或`symbol`,它们以多种格式输出前缀。例如
use unit_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 unit_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))
);