rust - 如何在不进行手动解析的情况下从可能包含剩余字符的字符串中解析 float ?

标签 rust floating-point

如何在不进行手动解析(例如 JS 中的 parseFloat())的情况下从可能包含遗留字符的字符串中解析 float ,并找出它的结束位置?

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

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

我该怎么做,最好没有外部库?

最佳答案

如评论中所述,您需要实现自己的浮点解析器或使用外部库。标准库中的解析器 always errors out when it encounters additional junk in the input string – 它甚至不允许前导或尾随空格。

nom 是一个很好用的外部 crate。它带有 integrated parser for floating-point numbers满足您的要求。示例:

use nom::number::complete::double;
let parser = double::<_, ()>;
assert_eq!(parser("2.0 abc"), Ok((" abc", 2.0)));
let result = parser("Nanananananana hey, Jude!").unwrap();
assert_eq!(result.0, "ananananana hey, Jude!");
assert!(result.1.is_nan());

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

关于rust - 如何在不进行手动解析的情况下从可能包含剩余字符的字符串中解析 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64465527/

相关文章:

c - c中的浮点运算

floating-point - 如何解码和编码 Rust 中的 float ?

rust - 如何使结构接受类型 `impl std::ops::Fn<()>` 作为其字段?

macros - 如何使用 Rust 中的宏生成复杂的枚举变体

sql-server - SQL Server Management Studio 中浮点类型的全精度输出

assembly - 从 5 位浮点表示计算值

string - 如何交换向量中不可复制的元素?

rust - 如何在Hyper处理程序之间共享HashMap?

c - 如果是整数,则使用 sprintf 格式化没有小数位的 float

c - 我们如何生成数字 x.y,其中 x 和 y 是两个参数或函数?