如何从可能包含剩余字符的字符串中解析浮点数而不进行手动解析?

vir*_*u13 5 floating-point rust

如何从可能包含剩余字符的字符串中解析浮点数,并找出它的结尾,而不进行手动解析(例如parseFloat()在 JS 中)?

一个例子是字符串"2e-1!"。我想评估字符串中的下一个浮点,以便我可以将此字符串拆分为"2e-1""!"(例如,如果我想实现一个计算器。)如果不编写解析器来查看浮点结束的位置,我将如何做到这一点作为&str,然后使用.parse()?

我知道这意味着我可能必须解析非标准的东西,例如"3e+1+e3"to 3e+1( 30) 和"+e3". 这是有意的;我不知道格式化浮点数的所有方法,尤其是对 Rust 有效的方法parse::<f64>(),但无论如何我都想处理它们。

我该如何做到这一点,最好没有外部库?

Sve*_*ach 3

正如评论中提到的,您需要实现自己的浮点解析器或使用外部库。标准库中的解析器在输入字符串\xe2\x80\x93 中遇到其他垃圾时总是会出错,它甚至不允许前导或尾随空格。

\n

一个很好用的外部板条箱是nom。它配备了一个集成的浮点数解析器,可以满足您的要求。例子:

\n
use nom::number::complete::double;\nlet parser = double::<_, ()>;\nassert_eq!(parser("2.0 abc"), Ok((" abc", 2.0)));\nlet result = parser("Nanananananana hey, Jude!").unwrap();\nassert_eq!(result.0, "ananananana hey, Jude!");\nassert!(result.1.is_nan());\n
Run Code Online (Sandbox Code Playgroud)\n

解析器期望浮点数位于字符串的开头。如果您想允许前导空格,可以先使用 删除它trim_start()

\n