如何解决 "value: ParseIntError" in rust?
How to solve "value: ParseIntError" in rust?
我正在尝试用 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)```
您的 read_line 也产生了一个换行符(您在选择内容时按下的输入)。您首先必须从输入中删除它,例如:
select.truncate(select.len()-1);
此外,您必须指定字符串必须解析为的目标类型:
let select = select.parse::<i32>().unwrap();
(您的代码片段的其余部分似乎未完成,因此不响应下方的错误)
在您的代码中,存在三个错误:
- 当您使用 stdin() 方法获取输入并想将其解析为另一种类型时,您必须输入 .trim() 因为 stdin() 会在您的输入中添加空格,因此您需要 trim 那些不需要的空格。
- 每次输入时都必须使用 io::stdin() 方法和 read_line 方法,以便编译器保留用户输入。
- 您使用了错误的转换公式。
我已经在你的代码中进行了更正,现在它工作正常,这里是代码片段:
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.");
}
}
您也可以参考此存储库。 Temperature converter rust
我正在尝试用 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)```
您的 read_line 也产生了一个换行符(您在选择内容时按下的输入)。您首先必须从输入中删除它,例如:
select.truncate(select.len()-1);
此外,您必须指定字符串必须解析为的目标类型:
let select = select.parse::<i32>().unwrap();
(您的代码片段的其余部分似乎未完成,因此不响应下方的错误)
在您的代码中,存在三个错误:
- 当您使用 stdin() 方法获取输入并想将其解析为另一种类型时,您必须输入 .trim() 因为 stdin() 会在您的输入中添加空格,因此您需要 trim 那些不需要的空格。
- 每次输入时都必须使用 io::stdin() 方法和 read_line 方法,以便编译器保留用户输入。
- 您使用了错误的转换公式。
我已经在你的代码中进行了更正,现在它工作正常,这里是代码片段:
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.");
}
}
您也可以参考此存储库。 Temperature converter rust