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 在 解析工具
15,512 每月下载量
在 3 crates 中使用
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的List
或Vec
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