#numbers #separator #string-representation #comma #localization #thousands

无 std num-format

一个用于生成符合国际标准的数字字符串表示的 Rust 包

10 个版本

0.4.4 2022 年 12 月 3 日
0.4.3 2022 年 10 月 10 日
0.4.0 2019 年 2 月 20 日
0.3.0 2019 年 2 月 19 日
0.1.2 2019 年 2 月 5 日

#1国际化(i18n) 中排名 1

Download history 133230/week @ 2024-04-29 123083/week @ 2024-05-06 144400/week @ 2024-05-13 149465/week @ 2024-05-20 142267/week @ 2024-05-27 146293/week @ 2024-06-03 147064/week @ 2024-06-10 145970/week @ 2024-06-17 153609/week @ 2024-06-24 144064/week @ 2024-07-01 146627/week @ 2024-07-08 149197/week @ 2024-07-15 155171/week @ 2024-07-22 148579/week @ 2024-07-29 153445/week @ 2024-08-05 167661/week @ 2024-08-12

每月下载量 632,982
用于 961 包(143 个直接使用)

MIT/Apache 许可协议

285KB
9K SLoC

num-format

Crates.io Documentation License

一个用于生成符合国际标准的数字字符串表示的 Rust 包,例如

  • "1,000,000" 对于美式英语
  • "10,00,000" 对于印式英语
  • "1 000 000" 对于法语法语

创建字符串表示

num-format 提供 三个 主要 API...

ToFormattedString

ToFormattedString trait 是三个 API 中最简单的一个。只需在实现该 trait 的类型(标准库中所有整数类型都实现了它)上调用 to_formatted_string 方法,同时提供所需的格式(见下文 选择格式)。但是,使用 ToFormattedString 总是堆分配;因此,它是三个 API 中最慢的,不能在 no_std 环境中使用。

use num_format::{Locale, ToFormattedString};

fn main() {
    let s = 1000000.to_formatted_string(&Locale::en);
    assert_eq!(&s, "1,000,000");
}

Buffer

使用 Buffer 类型是最快的 API,因为它 不会 堆分配。相反,格式化后的表示将写入栈分配的缓冲区。因此,您可以在 no_std 环境中使用它。

尽管此API适用于标准库中所有整数类型,但它不适用于像num_bigint::BigInt这样的类型,因为无法事先知道其最大大小。

use num_format::{Buffer, Locale};

fn main() {
    // Create a stack-allocated buffer...
    let mut buf = Buffer::default();

    // Write "1,000,000" into the buffer...
    buf.write_formatted(&1000000, &Locale::en);

    // Get a view into the buffer as a &str...
    let s = buf.as_str();

    // Do what you want with the &str...
    assert_eq!("1,000,000", s);
}

WriteFormatted

WriteFormatted特质位于另外两个API之间。您可以将格式化的表示写入任何实现了WriteFormatted的类型(例如标准库中实现了io::Writefmt::Write的类型,如VecStringFile等)。

如果您正在编写可以使用Buffer API的数字类型,则不会有堆分配。然而,io::Writefmt::Write机制增加了些开销;因此,直接使用Buffer类型会更高效。这个特质在no_std环境中不可用。

use num_format::{Locale, WriteFormatted};

fn main() {
    // Create a writer...
    let mut writer = String::new(); // Could also be Vec::new(), File::open(...), ...

    // Write "1,000,000" into the writer...
    writer.write_formatted(&1000000, &Locale::en);

    assert_eq!(&writer, "1,000,000");
}

选择格式

格式化选项(例如使用哪个千位分隔符,负号看起来像什么等)由Format特质表示。此crate提供了Format特质的三种具体实现...

地区

Locale类型是一个通过程序生成的枚举,它代表来自通用地区数据仓库的格式化标准,该仓库由Unicode联盟维护,并被Apple用于macOS和iOS,以及由LibreOffice、IBM在AIX中使用。

use num_format::{Grouping, Locale};

fn main() {
    let locale = Locale::en;
    assert_eq!(locale.grouping(), Grouping::Standard);
    assert_eq!(locale.minus_sign(), "-");
    assert_eq!(locale.name(), "en");
    assert_eq!(locale.separator(), ",");

    let locale2 = Locale::from_name("en").unwrap();
    assert_eq!(locale, locale2);

    let available = Locale::available_names();
    println!("All of the locale names available in the Unicode database are...");
    println!("{:#?}", available);
}

SystemLocale (在with-system-locale功能标志之后可用)

SystemLocale类型是另一种实现了Format的类型。它允许您访问您的操作系统地区信息。它具有与Locale非常相似的API,并且应该在所有主要操作系统上(即macOS、linux、BSD和Windows)正常工作。

由于此类型需要几个依赖项(尤其是在Windows上),它位于功能标志之后。要使用它,请在您的 Cargo.toml 中包含以下代码:num-format = { version = "0.4.3", features = ["with-system-locale"] }。另外,在Windows上(但仅限Windows),使用 SystemLocale 需要 Clang 3.9 或更高版本。

use num_format::SystemLocale;

fn main() {
    let locale = SystemLocale::default().unwrap();
    println!("My system's default locale is...");
    println!("{:#?}", &locale);

    let available = SystemLocale::available_names().unwrap();
    println!("My available locale names are...");
    println!("{:#?}", available);

    match SystemLocale::from_name("en_US") {
        Ok(_) => println!("My system has the 'en_US' locale."),
        Err(_) => println!("The 'en_US' locale is not included with my system."),
    }
}

自定义格式

CustomFormat 是实现 Format 的第三个和最后一个类型。您可以使用它来构建自己的自定义格式。

use num_format::{Buffer, Error, CustomFormat, Grouping};

fn main() -> Result<(), Error> {
    let format = CustomFormat::builder()
        .grouping(Grouping::Indian)
        .minus_sign("🙌")
        .separator("😀")
        .build()?;

    let mut buf = Buffer::new();
    buf.write_formatted(&(-1000000), &format);
    assert_eq!("🙌10😀00😀000", buf.as_str());

    Ok(())
}

要求

  • 如果使用 --no-default-features 编译,则需要 Rust 1.56.0 或更高版本
  • 如果使用默认功能编译,则需要 Rust 1.58.0 或更高版本
  • 如果您正在使用 with-system-locale 功能 并且 您在Windows上,也需要 Clang 3.9 或更高版本。有关安装说明,请参阅 此处

额外功能

可用功能 在您的 Cargo.toml 中应包含什么
no_std num-format= {version= "0.4.3",default-features= false }
with-num-bigint num-format= {version= "0.4.3",features= ["with-num-bigint"] }
with-serde num-format= {version= "0.4.3",features= ["with-serde"] }
with-system-locale num-format= {version= "0.4.3",features= ["with-system-locale"] }

许可

num-format 根据 Apache License, Version 2.0 或 MIT 许可证之一进行许可。

您可选。

依赖项

~0–1.6MB
~41K SLoC