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>()
,但无论如何我都想处理它们。
我该如何做到这一点,最好没有外部库?
正如评论中提到的,您需要实现自己的浮点解析器或使用外部库。标准库中的解析器在输入字符串\xe2\x80\x93 中遇到其他垃圾时总是会出错,它甚至不允许前导或尾随空格。
\n一个很好用的外部板条箱是nom
。它配备了一个集成的浮点数解析器,可以满足您的要求。例子:
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()
。