#numbers #format #num #convert #localization #localized

format_num_pattern

根据模式字符串格式化数字;本地化

3个版本

0.9.2 2024年5月8日
0.9.1 2024年4月27日
0.9.0 2024年4月27日

#69 in 值格式化

Download history 140/week @ 2024-04-21 144/week @ 2024-04-28 118/week @ 2024-05-05 26/week @ 2024-05-12 20/week @ 2024-05-19 22/week @ 2024-05-26 22/week @ 2024-06-02 18/week @ 2024-06-09 11/week @ 2024-06-16 24/week @ 2024-06-23 30/week @ 2024-06-30 4/week @ 2024-07-07 21/week @ 2024-07-14 41/week @ 2024-07-21 37/week @ 2024-07-28

103 个月下载量
6 个crate中使用 (3 直接使用)

MIT/Apache

58KB
1K SLoC

crates.io Documentation License License

数字格式化

这个使用模式字符串而不是format!风格。

本地化

本地化使用[NumberSymbols]。地区数据由pure_rust_locales提供。

要求

此库中的数字是任何类型,它是LowerExp + Display。字符串转换是通过format!("{}")format!("{:e}")完成的,这个字符串在'.'和'e'处分割,并应用模式。数字本身没有进行验证,以节省时间。

解析需要FromStr

  • parse_sym()只接受符号,并从输入中删除所有不是数字或小数分隔符的内容。然后将结果传递给FromStr
  • parse_fmt()接受一个NumberFormat,并要求模式完全匹配。识别的部分按正确的顺序重新组装,并传递给FromStr

示例

use format_num_pattern::Locale::de_AT_euro;
use format_num_pattern as num;
use format_num_pattern::{NumberFormat, NumberSymbols};

// formats accordingly, uses the default symbols.
let s = num::format(4561.2234, "###,##0.00").expect("works");
assert_eq!(s, "  4,561.22");

// uses symbols
let sym = NumberSymbols::monetary(de_AT_euro);
let s = num::formats(4561.2234, "$ ###,##0.00", &sym).expect("works");
assert_eq!(s.as_str(), "€   4\u{202f}561,22");

// prepared format
let sym = NumberSymbols::monetary(de_AT_euro);
let m2 = NumberFormat::news("$ ###,##0.00", sym).expect("works");

let s = m2.fmt(4561.2234).expect("works");
assert_eq!(s.as_str(), "€   4\u{202f}561,22");

// postfix fmt using the FormatNumber trait
use format_num_pattern::DisplayNumber;
println!("combined output: {}", 4561.2234f64.fmt(&m2));

模式

以下模式被识别

  • 0 - 数字或0
  • 9 - 数字或空格
  • # - 数字或符号或空格
  • - - 符号;正数时显示空格
  • + - 符号;正数显示 '+',负数显示 '-'。未本地化。
  • . - 小数分隔符
  • : - 小数分隔符,始终显示
  • , - 分组分隔符。如果格式符号如此指定,可能完全不存在。
  • E - 大写指数
  • e - 小写指数
  • - 空格可以用作分隔符
  • '$' - 货币。输出长度根据货币符号可变。
  • \ - 所有 ASCII 字符(ASCII 32-128!)都是保留的,必须转义。
  • _ - 其他 Unicode 字符可以使用而不需要转义。

性能

我运行的一个简单基准测试给出了以下时间:

  • 1.68 x 格式!
  • 3.5 x ryu

依赖关系

~4MB
~45K SLoC