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
每月下载量 632,982
用于 961 个 包(143 个直接使用)
285KB
9K SLoC
num-format
一个用于生成符合国际标准的数字字符串表示的 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::Write
或fmt::Write
的类型,如Vec
、String
、File
等)。
如果您正在编写可以使用Buffer
API的数字类型,则不会有堆分配。然而,io::Write
和fmt::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