如何解析八进制字符串作为Rust中的浮点数?

问题描述 投票:0回答:1

我需要取一个八进制字符串,例如“42.1”,并从中获取一个浮点数(34.125)。在Rust中最好的方法是什么?我看到there previously was a from_str_radix function, but it's now removed

parsing floating-point rust
1个回答
1
投票
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。如果中间整数溢出,它也会失败。

© www.soinside.com 2019 - 2024. All rights reserved.