#numbers #human-readable #iterator #parser

number_range

解析从/到可读字符串的数字列表的库

9 个版本

0.3.2 2023年5月31日
0.3.1 2023年5月31日
0.2.0 2023年3月5日
0.1.4 2023年2月5日

58解析工具

Download history 2153/week @ 2024-03-14 1880/week @ 2024-03-21 1941/week @ 2024-03-28 2078/week @ 2024-04-04 1955/week @ 2024-04-11 2236/week @ 2024-04-18 2375/week @ 2024-04-25 1810/week @ 2024-05-02 2314/week @ 2024-05-09 2540/week @ 2024-05-16 2448/week @ 2024-05-23 2443/week @ 2024-05-30 2806/week @ 2024-06-06 4535/week @ 2024-06-13 4504/week @ 2024-06-20 3196/week @ 2024-06-27

15,512 每月下载量
3 crates 中使用

GPL-3.0-only

34KB
570

简介

这是一个简单的库,可以将人类可读的字符串中的数字范围转换为数值类型,反之亦然。例如:在 "1-2" & [1,2]"1,3:5" & [1,3,4,5] 之间进行转换。

主要有两种分隔符(更多类型请参阅文档),list_sep(默认 ,)和 range_sep(默认 :),首先用列表分隔符分隔字符串,然后将各个部分视为范围,有三种类型的范围

  • number ⇒ 单个数字(例如 3
  • start:end ⇒ 包含步长为 1 的范围(例如 1:10
  • start:step:end ⇒ 包含可变步长的范围(例如 1:2:10

免责声明

这是一个不稳定的库,我会在弄清楚如何使解析最优之前,改变一些可能破坏与旧版本兼容性的东西。

尽管名称叫做 Number Range,但这是为了与整数一起使用而设计的,尽管泛型也适用于浮点数,但结果可能不会如预期(这是在 Rust 中使用浮点运算的局限性)。

用途

NumberRange

简单用法是

NumberRange::<i64>::default()
	.parse_str("-10,3:10,14:2:20")?;

它将返回一个迭代器,您可以使用它来遍历这些数字。您可以使用.collect::Vec<T>()将其收集到向量中。如果迭代器用完并想再次迭代,可以使用.parse()

由于限制,字符串中的所有数字都必须是您想要解析的类型,即使是步长也需要是无符号整数(这意味着"4:-1:1"也会失败,即使最终输出应该是无符号的)。

NumberRangeOptions

可以使用NumberRangeOptions来自定义分隔符。例如,如果您正在处理无符号数字,则可以使用-作为范围分隔符来解析来自许多源的范围。

NumberRangeOptions::new()
             .with_list_sep(',')
             .with_range_sep('-')
             .parse::<usize>("1,3-10,14")?;

使用本地化解析数字。

let rng: Vec<usize> = NumberRangeOptions::new()
             .with_list_sep('/')
             .with_range_sep('-')
             .with_group_sep(',')
             .with_whitespace(true)
             .parse("1,200/1, 400, 230")?.collect();
assert_eq!(rng, vec![1200, 1400230]);

从Rust的ListVec

assert_eq!(
    format!("{}", NumberRange::default()
           .from_vec(&[1,3,4,5,6,7,8,9,10,14], None)),
                     "1,3:10,14");

链接

依赖项

~1MB
~20K SLoC