Как решить "значение: ParseIntError" в ржавчине? - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь создать конвертер Фаренгейта в Цельсий в Rust.

Я успешно скомпилировал его, но не знаю, что пошло не так во время выполнения. Это из-за преобразования?

Вот мой код:

use std::io;

fn main(){
    println!("Please select\n 1.CELSIUS to FAHRENHEIT\n 2.FAHRENHEIT to CELSIUS");

    const CEL_FAH: f64 = 32.00;
    const FAH_CEL: f64 = -17.22;

    let mut select = String::new();

    io::stdin().read_line(&mut select)
    .expect("Please select the appropriate options");

    let select: i32 = select.parse().unwrap();

    //control flow

    if select == 1 {
        println!("1. CELSIUS - FAHRENHEIT: ");

        let cels = String::new();

        let cels: f64 = cels.parse().unwrap();

        let ans1 = cels * CEL_FAH;

        println!("Conversions: {}", ans1);
    } else if select == 2 {

        println!("2. FAHRENHEIT - CELSIUS: ");

        let fahs = String::new();

        let fahs: f64 = fahs.parse().unwrap();

        let ans2 = fahs * FAH_CEL;

        println! ("Conversions: {}", ans2);
    }else {

        println!("Select the options please.");
    }


}

Вот мой вывод и ошибка:

   Compiling converter v0.1.0 (D:\Program Files\Rust Projects\converter)
    Finished dev [unoptimized + debuginfo] target(s) in 2.46s
     Running `target\debug\converter.exe`
Please select
 1.CELSIUS to FAHRENHEIT
 2.FAHRENHEIT to CELSIUS
2
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: ParseIntError { kind: InvalidDigit }', src\main.rs:19:23
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
error: process didn't exit successfully: `target\debug\converter.exe` (exit code: 101)```

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

В вашем коде есть три ошибки:

  1. Когда вы берете ввод с помощью метода stdin () и хотите разобрать его в другой тип, вы должны поставить .trim (), потому что stdin () добавляет пробелы с вашим вводом, поэтому вам нужно обрезать эти нежелательные пробелы.
  2. Каждый раз, когда вы берете ввод, вы должны использовать метод io :: stdin () вместе с методом read_line, чтобы компилятор удерживал пользовательский ввод.
  3. Вы использовали неправильную формулу для преобразования.

Я внес исправления в ваш код, и теперь он работает нормально, вот фрагмент:

use std::io;

fn main() {
    println!("Please select\n 1.CELSIUS to FAHRENHEIT\n 2.FAHRENHEIT to CELSIUS");

    const CEL_FAH: f64 = 32.00;
    const FAH_CEL: f64 = 1.8; //changed

    let mut select = String::new();

    io::stdin()
        .read_line(&mut select)
        .expect("Please select the appropriate options");

    let select: i32 = select.trim().parse().unwrap(); // .trim() method requires when taking input

    //control flow

    if select == 1 {
        println!("1. CELSIUS - FAHRENHEIT: ");

        let mut cels = String::new();
        io::stdin()
            .read_line(&mut cels)
            .expect("Please input a temperature in degrees"); // when you're taking input from user you have to use stdin()

        let cels: f64 = cels.trim().parse().unwrap();

        let ans1 = (cels * FAH_CEL) + CEL_FAH; //this the correct formula to convert from celsius to fahrenheit

        println!("Conversions: {}", ans1);
    } else if select == 2 {
        println!("2. FAHRENHEIT - CELSIUS: ");

        let mut fahs = String::new();
        io::stdin()
            .read_line(&mut fahs)
            .expect("Please input a temperature in degrees"); //when you're taking input from user you have to use stdin()

        let fahs: f64 = fahs.trim().parse().unwrap();

        let ans2 = (fahs - CEL_FAH) * 5. / 9.; //this the correct formula to convert from fahrenheit to celsius

        println!("Conversions: {}", ans2);
    } else {
        println!("Select the options please.");
    }
}

Вы также можете обратиться к этому хранилищу. Преобразователь температуры ржавчины

0 голосов
/ 12 апреля 2020

Ваша read_line также дала новую строку (ввод, который вы нажимали при выборе чего-либо). Сначала вы должны удалить это из входных данных, например, так:

select.truncate(select.len()-1);

Кроме того, вы должны указать тип цели, с которой должна быть проанализирована строка:

let select = select.parse::<i32>().unwrap();

(остальная часть вашего фрагмента кажется незавершенной, поэтому там не реагируют на ошибки)

...