Преобразовать строку в int в Rust?
Примечание: этот вопрос содержит устаревший код до 1.0! Ответ правильный, хотя.
Чтобы преобразовать str
для int
в Rust я могу сделать это:
let my_int = from_str::<int>(my_str);
Единственный способ, которым я знаю, как конвертировать String
для int
чтобы получить кусок этого, а затем использовать from_str
на нем вот так:
let my_int = from_str::<int>(my_string.as_slice());
Есть ли способ напрямую конвертировать String
для int
?
8 ответов
Вы можете напрямую конвертировать в int, используя str::parse::<T>()
метод.
let my_string = "27".to_string(); // `parse()` works with `&str` and `String`!
let my_int = my_string.parse::<i32>().unwrap();
Вы можете указать тип для анализа с помощью оператора TurboFish (::<>
), как показано выше или с помощью явной аннотации типа:
let my_int: i32 = my_string.parse().unwrap();
Как уже упоминалось в комментариях, parse()
возвращает Result
, Этот результат будет Err
если строка не может быть проанализирована как указанный тип (например, строка "peter"
не может быть проанализирован как i32
).
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(),
}
parse
возвращает core::result::Result<u32, core::num::ParseIntError>
а также unwrap
msgstr "удаляет значение v из опции, если оно равно Some(v) [или] Panics, если значение self равно None".
parse
является универсальной функцией, поэтому тип в угловых скобках.
Если вы получите свою строку из stdin().read_line
Вы должны урезать это сначала.
let my_num: i32 = my_num.trim().parse()
.expect("please give me correct string number!");
С недавнего вечера вы можете сделать это:
let my_int = from_str::<int>(&*my_string);
Что здесь происходит, так это String
теперь может быть разыменован в str
, Тем не менее, функция хочет &str
поэтому мы должны снова позаимствовать. Для справки, я считаю, что этот конкретный шаблон (&*
) называется "перекрестное заимствование".
Да, вы можете использовать метод parse для строки, чтобы напрямую преобразовать ее в целое число, например:
let my_string = "42".to_string();
let my_int = my_string.parse::<i32>().unwrap();
Метод 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
},
};
К вашему сведению, метод parse доступен для любого типа, который реализует черту FromStr, включая все целые типы (например, i32, i64 и т. д.), а также многие другие типы, такие как f32 и bool.
Вы можете использовать FromStr
черты from_str
метод, который реализован для i32
:
let my_num = i32::from_str("9").unwrap_or(0);
Ну нет. Почему там должно быть? Просто отбросьте строку, если она вам больше не нужна.
&str
полезнее, чем String
когда вам нужно только прочитать строку, потому что это только просмотр исходного фрагмента данных, а не его владельца. Вы можете передать его легче, чем String
и он копируемый, поэтому он не используется вызываемыми методами. В этом отношении это более общее: если у вас есть String
, вы можете передать его туда, где &str
ожидается, но если у вас есть &str
, вы можете только передать его функциям, ожидающим String
если вы делаете новое распределение.
Вы можете найти больше информации о различиях между ними и о том, когда их использовать, в официальном руководстве по строкам.
Итак, в основном вы хотите преобразовать String в Integer правильно! вот что я в основном использую, и это также упоминается в официальной документации..
fn main() {
let char = "23";
let char : i32 = char.trim().parse().unwrap();
println!("{}", char + 1);
}
Это работает как для String, так и для &str. Надеюсь, это тоже поможет.