在Rust中将String转换为int?

mta*_*med 137 rust

注意:此问题包含已弃用的1.0之前的代码!答案是正确的.

要将一个转换str为一个int在Rust中,我可以这样做:

let my_int = from_str::<int>(my_str);
Run Code Online (Sandbox Code Playgroud)

我知道如何将一个转换的唯一方法Stringint是得到它的一个切片,然后用from_str它像这样:

let my_int = from_str::<int>(my_string.as_slice());
Run Code Online (Sandbox Code Playgroud)

有没有办法直接将a转换Stringint

小智 192

您可以使用该str::parse::<T>()方法直接转换为int .

let my_string = "27".to_string();  // `parse()` works with `&str` and `String`!
let my_int = my_string.parse::<i32>().unwrap();
Run Code Online (Sandbox Code Playgroud)

您可以使用::<>上面显示的turbofish operator()或通过显式类型注释指定要解析的类型:

let my_int: i32 = my_string.parse().unwrap();
Run Code Online (Sandbox Code Playgroud)

如评论中所述,parse()返回a Result.Err如果无法将字符串解析为指定的类型(例如,"peter"无法将字符串解析为i32),则此结果将是.

  • 注意[`parse`返回一个`Result`](http://doc.rust-lang.org/std/primitive.str.html#method.parse),所以你需要适当地处理它才能到达实际积分型. (27认同)
  • _涡轮鱼操作员_?这么酷的名字。以前从未听说过:) (22认同)
  • 如果您已经知道如何处理结果,这将非常有帮助。我建议扩大答案以适应任何不这样做的人。 (2认同)
  • @SaeedAhadian这确实是东西的名字:https://doc.rust-lang.org/reference/glossary.html?highlight=turbo#turbofish (2认同)

Jar*_*eck 41

let my_u8: u8 = "42".parse::<u8>().unwrap();
let my_u32: u32 = "42".parse::<u32>().unwrap();

// or, to be safe, match the `Err`
match "foobar".parse::<i32>() {
  Ok(n) => do_something_with(n),
  Err(e) => weep_and_moan(),
}
Run Code Online (Sandbox Code Playgroud)

parse返回a core::result::Result<u32, core::num::ParseIntError>unwrap"将值v移出Option,如果它是Some(v)[或] Panics,如果self值等于None".

parse是一个通用函数,因此是尖括号中的类型.

  • 如果指定变量的类型(`let my_u8:u8`),则不需要尖括号中的值.另请注意,流行的Rust风格表示`:`应该粘在左侧. (7认同)
  • 具体来说,我的意思是"让my_u32:u32 ="42".parse().unwrap()` (3认同)

小智 23

如果您从 中获取字符串stdin().read_line,则必须先修剪它。

let my_num: i32 = my_num.trim().parse()
   .expect("please give me correct string number!");
Run Code Online (Sandbox Code Playgroud)

  • 非常重要的细节! (8认同)

小智 11

是的,您可以在字符串上使用 parse 方法将其直接转换为整数,如下所示:

let my_string = "42".to_string();
let my_int = my_string.parse::<i32>().unwrap();
Run Code Online (Sandbox Code Playgroud)

parse方法返回一个Result对象,因此您需要处理字符串无法解析为整数的情况。如果解析成功,您可以使用上面所示的 unwrap 来获取值,否则如果解析失败,则会出现混乱。

或者您可以使用匹配表达式分别处理成功和失败的情况,如下所示:

let my_string = "42".to_string();
let my_int = match my_string.parse::<i32>() {
    Ok(n) => n,
    Err(_) => {
        println!("Failed to parse integer");
        0
    },
};
Run Code Online (Sandbox Code Playgroud)

仅供参考,parse 方法可用于实现 FromStr 特征的任何类型,其中包括所有整数类型(例如 i32、i64 等)以及许多其他类型,例如 f32 和 bool。


DK.*_*DK. 6

最近每晚,您可以这样做:

let my_int = from_str::<int>(&*my_string);
Run Code Online (Sandbox Code Playgroud)

这里发生的事情String现在可以被解除引用str.但是,功能想要一个&str,所以我们必须再次借用.作为参考,我相信这个特殊模式(&*)被称为"交叉借用".

  • 或者,您可以将`my_sttring.as_slice()`表达为`my_string []`(当前`slicing_syntax`是特征门控的,但最有可能的某种形式最终会出现在语言中). (2认同)

Kar*_*uri 5

您可以使用FromStrtrait 的from_str方法,该方法为i32

let my_num = i32::from_str("9").unwrap_or(0);
Run Code Online (Sandbox Code Playgroud)