Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 解析整数,忽略任何非数字后缀_Rust - Fatal编程技术网

Rust 解析整数,忽略任何非数字后缀

Rust 解析整数,忽略任何非数字后缀,rust,Rust,我有一个以数字开头的字符串列表。然而,我不知道他们的结局是什么。一些示例可能是“12/1/1”,“33”,或“17abc”。我想读取每个字符串开头的数字,将示例分别转换为12、33和17 我已经让它与下面的代码一起工作 “12/1/1”.chars()。在(| c | c.是数字())时取。收集:()。解析:() 然而,我确实觉得存在一种更高效/更清洁的解决方案。没有字符串集合和/或不太详细的字符串。 我宁愿不使用任何外部板条箱。这看起来像是正则表达式(Regex)的工作。您只需要获取第一组数

我有一个以数字开头的字符串列表。然而,我不知道他们的结局是什么。一些示例可能是
“12/1/1”
“33”
,或
“17abc”
。我想读取每个字符串开头的数字,将示例分别转换为
12
33
17

我已经让它与下面的代码一起工作

“12/1/1”.chars()。在(| c | c.是数字())时取。收集:()。解析:()
然而,我确实觉得存在一种更高效/更清洁的解决方案。没有字符串集合和/或不太详细的字符串。

我宁愿不使用任何外部板条箱。

这看起来像是正则表达式(Regex)的工作。您只需要获取第一组数字,这样就可以使用“/d”(整数)描述符,或者使用“[0-9]”(0到9之间的字符范围,包括0到9之间的字符),然后使用“+”来表示您希望字符类重复1次或更多次


我不是一个Rust程序员,所以我不能在细节上给你太多帮助,但你可以在这里找到Rust的Regex文档:

在Rust的夜间版本中,你可以使用迭代器上的实验来解决这个问题,通过将每个数字字符映射到一个整数(直到我们不能这样做,即
c.to_digit(10))
返回
None
)。然后我们使用
fold
构造最终的数字

#![特征(国际热核实验堆地图)]
fn main(){
let number=“12/1/1”
.chars()
.map|u while(| c | c.到|u数字(10))
.折叠(0,| acc,数字| acc*10+数字);
println!(“{}”,数字);//12
}
请注意,没有创建单独的
字符串,这是最好的,因为在堆上创建许多字符串需要相当长的时间(相对于只处理堆栈上的数字而言)

在stable Rust中,它有点冗长:

fn main(){
let number=“12/1/1”
.chars()
.地图(| c | c.至|数字(10))
.take_while(| opt | opt.is_some())
.折叠(0,| acc,数字| acc*10+数字.unwrap());
println!(“{}”,数字);//12
}

这取决于你对“更好”的定义。如果只想删除不必要的
字符串
创建,那么可以使用

或者,您也可以使用和创建自己的
atoi()
函数:

//nom=“6.0”
使用nom::character::complete::digit0;
使用nom::error::error;
使用std::str::FromStr;
fn atoi(输入:&str)->结果{
digit0::(输入).unwrap().1.parse::()
}
fn main(){
println!(“{:?}”,atoi::(“12/1/1”);//Prints`Ok(12)`
println!(“{:?}”,atoi::(“33”);//Prints`Ok(33)`
println!(“{:?}”,atoi::(“17abc”);//Prints`Ok(17)`
println!(“{:?}”,atoi::(“abc”);//Prints`Err(parseinteror{kind:Empty})`
println!(“{:?}”,atoi::(“”);//Prints`Err(parseinteror{kind:Empty})`
}
unwrap()


由于您不想使用任何外部板条箱,因此可以使用来获取第一个非数字字符的索引

请注意,@AlexLarionov的回答会因溢出而惊慌失措,而这个答案不会

使用std::str::FromStr;
fn atoi(输入:&str)->结果{
设i=input.find(| c:char |!c.is_numeric())。unwrap_或_else(| input.len());
输入[…i]。解析::()
}
fn main(){
println!(“{:?}”,atoi::(“12/1/1”);//Prints`Ok(12)`
println!(“{:?}”,atoi::(“33”);//Prints`Ok(33)`
println!(“{:?}”,atoi::(“17abc”);//Prints`Ok(17)`
println!(“{:?}”,atoi::(“abc”);//Prints`Err(parseinteror{kind:Empty})`
println!(“{:?}”,atoi::(“”);//Prints`Err(parseinteror{kind:Empty})`
println!(“{:?}”,原子:(“12345678910112131415”);
//打印`Err(parseinteror{kind:PosOverflow})`
}

定义“更好”。你是说没有克隆人?用更少的代码?允许使用外部板条箱吗?你能解决你的问题真是太好了!你应该把它作为一个答案,而不是你问题的一部分,然后潜在地接受这个答案。这样,问题就会在搜索结果中显示为已解决,人们可以对你的答案进行投票,你的解决方案对未来有相同问题的人会更有帮助。密切相关(使用浮点而不是整数):@vallentin我已更新我的问题,不使用“更好”警告:如果整数溢出,这将导致恐慌。这个答案与我想象的最接近(删除额外的字符串)。但这有点冗长。如果没有其他答案,我会接受的。@Netråm好吧,你有一个非普通的任务,显然你必须以某种方式对它进行编程。最后,如果某些内容很冗长,请将其隐藏在函数后面