如何解析八进制字符串作为Rust中的浮点数?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何解析八进制字符串作为Rust中的浮点数?相关的知识,希望对你有一定的参考价值。
我需要取一个八进制字符串,例如“42.1”,并从中获取一个浮点数(34.125)。在Rust中最好的方法是什么?我看到there previously was a from_str_radix function, but it's now removed。
答案
use std::fmt;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ParseFloatError {
_private: (),
}
impl ParseFloatError {
fn new() -> ParseFloatError {
ParseFloatError { _private: () }
}
}
impl fmt::Display for ParseFloatError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Could not parse float")
}
}
pub fn parse_float_radix(s: &str, radix: u32) -> Result<f64, ParseFloatError> {
let s2 = s.replace(".", "");
let i = i64::from_str_radix(&s2, radix).map_err(|_| ParseFloatError::new())?;
let count = s.split('.').count();
let fraction_len: usize;
match count {
0 => unreachable!(),
1 => fraction_len = 0,
2 => fraction_len = s.split('.').last().unwrap().len(),
_ => return Err(ParseFloatError::new()),
}
let f = (i as f64) / f64::from(radix).powi(fraction_len as i32);
Ok(f)
}
fn main() {
println!("{}", parse_float_radix("42.1", 8).unwrap());
}
它首先将输入解析为整数,然后将其除以radix ^ number_of_fractional_digits。
它不支持科学记数法或特殊值,如无穷大或NaN。如果中间整数溢出,它也会失败。
以上是关于如何解析八进制字符串作为Rust中的浮点数?的主要内容,如果未能解决你的问题,请参考以下文章