Анализ 50-значного целого числа из файла CSV: ParseIntError {kind: Overflow} - PullRequest
1 голос
/ 15 июня 2019

Какое максимальное количество цифр может быть проанализировано как u128.Я сталкиваюсь с Err(ParseIntError { kind: Overflow }) при попытке разобрать 50-значное положительное число.

Моя ошибка:

...
...
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 должен удалить это, и мне кажется, что он удаляет, потому что кажется, что в непарсированном выводе нет ничего, кроме \t форматера в println!

.врожденное ограничение или что-то я не так делаю?

1 Ответ

2 голосов
/ 15 июня 2019

Наибольшее u128 равно 2 ** 128-1 = 340282366920938463463374607431768211455, что меньше 50 цифр, поэтому вам придется использовать struct num::bigint::BigInt (из ящика num).

Вы можете анализировать большие целые числа с помощью черты 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));
}
...