#numeric

无std unit-prefix

使用公制和二进制单位前缀格式化数字

1个不稳定版本

0.5.0 2024年2月17日

#1586 in 数学

MIT许可协议

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))
);

无运行时依赖

特性