如何解析八进制字符串作为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中的浮点数?的主要内容,如果未能解决你的问题,请参考以下文章

将结构与 rust 中的浮点数进行比较

如何将具有十进制值的数字转换为PL / SQL中的浮点数?

如何正确地将作为 CSV 文件中字符串的浮点数/双精度数作为浮点数/双精度数导入程序?

为啥不使用基于二进制补码的浮点数?

如何将小数字转换为python中的浮点数? [复制]

c语言中如何将10进制的浮点数转化为16进制数