rust - 从 csv 文件 : ParseIntError { kind: Overflow } 解析一个 50 位整数

标签 rust rust-crates

可以解析为u128的最大位数是多少。我在尝试解析 50 位正整数时遇到 Err(ParseIntError { kind: Overflow })

我的错误:

...
...
result: id 89 "40789923115535562561142322423255033685442488917353"      Err(ParseIntError { kind: Overflow })
result: id 90 "44889911501440648020369068063960672322193204149535"      Err(ParseIntError { kind: Overflow })
result: id 91 "41503128880339536053299340368006977710650566631954"      Err(ParseIntError { kind: Overflow })
result: id 92 "81234880673210146739058568557934581403627822703280"      Err(ParseIntError { kind: Overflow })
result: id 93 "82616570773948327592232845941706525094512325230608"      Err(ParseIntError { kind: Overflow })
result: id 94 "22918802058777319719839450180888072429661980811197"      Err(ParseIntError { kind: Overflow })
result: id 95 "77158542502016545090413245809786882778948721859617"      Err(ParseIntError { kind: Overflow })
result: id 96 "72107838435069186155435662884062257473692284509516"      Err(ParseIntError { kind: Overflow })
result: id 97 "20849603980134001723930671666823555245252804609722"      Err(ParseIntError { kind: Overflow })
result: id 98 "53503534226472524250874054075591789781264330331690"      Err(ParseIntError { kind: Overflow })
...
...

对应的代码:

fn read_num(a: &mut Reader<File>) -> Result<u128, Error> {
    let mut sum: u128 = 0;
    for(idx, res) in a.records().enumerate() {
        let res = res.unwrap();
        let val: StringRecord = res;
        let ii = val.get(0).unwrap().trim().parse::<u128>().unwrpa();
        println!("result: id {} {:?}\t {:?}", idx, val.get(0).unwrap(), ii);
    }; // This is formatted
    Ok(sum)
}

我最初认为这一定是由于每行末尾的换行符,但是 trim 应该删除它并且在我看来它正在删除,因为未解析的输出没有'除了 println!

中的 \t 格式化程序外似乎没有任何其他内容

溢出是由于固有限制还是我做错了什么?

最佳答案

最大的 u128 是 2**128-1 = 340282366920938463463374607431768211455,不到 50 位,所以你必须使用 struct num::bigint::BigInt(来自 num crate )。

您可以通过 FromStr 特性解析大整数。下面是解析两个 50 位数字并将它们相乘的示例:

extern crate num;

use num::BigInt;
use std::str::FromStr;
use std::ops::Mul;

fn main() {
    let x = BigInt::from_str("9879878782352398572398755757923351299981243778899").unwrap();
    let y = BigInt::from_str("3234235766473868388883432903721391827312463782828").unwrap();
    println!("{}", x.mul(y));
}

关于rust - 从 csv 文件 : ParseIntError { kind: Overflow } 解析一个 50 位整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56608437/

相关文章:

rust - 无法移出借用的上下文

rust - 为什么 solicit 0.4.4 尝试使用 openssl 0.9.12,即使我的 Cargo.toml 中有 openssl 0.7.14?

rust - 我怎样才能知道一个 crate 是否与特定的 Rust 版本兼容?

rust - 在 Rust 中初始化作用域内变量的正确方法

rust - 通过变量访问结构字段

rust - 有没有办法在 proc-macro crate 中具有公共(public)特征?

compiler-errors - 如何添加外部软件包并在rust编译器中运行?

dependencies - 如果相关功能被禁用,如何跳过依赖项

embedded - 我如何编写将全局变量/静态变量放在填充的 BSS 段中的 Rust 代码?

rust - 从创建结构的宏的参数访问 self