Convert a String to int?
Solution 1:
You can directly convert to an int using the str::parse::<T>()
method.
let my_string = "27".to_string(); // `parse()` works with `&str` and `String`!
let my_int = my_string.parse::<i32>().unwrap();
You can either specify the type to parse to with the turbofish operator (::<>
) as shown above or via explicit type annotation:
let my_int: i32 = my_string.parse().unwrap();
As mentioned in the comments, parse()
returns a Result
. This result will be an Err
if the string couldn't be parsed as the type specified (for example, the string "peter"
can't be parsed as i32
).
Solution 2:
let my_u8: u8 = "42".parse().unwrap();
let my_u32: u32 = "42".parse().unwrap();
// or, to be safe, match the `Err`
match "foobar".parse::<i32>() {
Ok(n) => do_something_with(n),
Err(e) => weep_and_moan(),
}
str::parse::<u32>
returns a Result<u32, core::num::ParseIntError>
and Result::unwrap
"Unwraps a result, yielding the content of an Ok
[or] panics if the value is an Err
, with a panic message provided by the Err
's value."
str::parse
is a generic function, hence the type in angle brackets.
Solution 3:
If you get your string from stdin().read_line
, you have to trim it first.
let my_num: i32 = my_num.trim().parse()
.expect("please give me correct string number!");
Solution 4:
With a recent nightly, you can do this:
let my_int = from_str::<int>(&*my_string);
What's happening here is that String
can now be dereferenced into a str
. However, the function wants an &str
, so we have to borrow again. For reference, I believe this particular pattern (&*
) is called "cross-borrowing".