Rust에서 문자열을 int로 변환 하시겠습니까?


187

참고 :이 질문에는 더 이상 사용되지 않는 1.0 이전 코드가 포함되어 있습니다! 대답은 맞습니다.

을 변환하려면 strint녹, 나는이 작업을 수행 할 수 있습니다 :

let my_int = from_str::<int>(my_str);

나는 변환하는 방법을 알고있는 유일한 방법 String으로는 int그것의 조각을 얻을 후 사용하는 것 from_str과 같이 그 위에 :

let my_int = from_str::<int>(my_string.as_slice());

직접 변환하는 방법이 String로는 int?


1
10 진수가 아닌 (예 : 16 진) stackoverflow.com/q/32381414/500207 도 참조하십시오 .
Ahmed Fasih

2
다소 명백하지만 2014 년 이후 에이 질문을 잘 발견하고 from_str이 범위에없는 이유를 궁금해하는 사람에게는 메모가 없습니다. use std::str::FromStr;그 수정. 원하는 경우 from_str에 대해 자세히 알아보십시오. doc.rust-lang.org/std/str/trait.FromStr.html#tymethod.from_str
7l-l04

답변:


261

str::parse::<T>()메소드를 사용하여 int로 직접 변환 할 수 있습니다 .

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()a를 반환합니다 Result. 이 결과는 Err문자열을 지정된 유형으로 구문 분석 할 수없는 경우입니다 (예 : 문자열 "peter"을로 구문 분석 할 수 없음 i32).


35
parse반환Result 하므로 실제 정수 유형에 도달하려면 적절하게 처리해야합니다.
Shepmaster

54
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(),
}

str::parse::<u32>a Result<u32, core::num::ParseIntError>Result::unwrap"결과의 래핑 해제 Ok, 값이 '인 Err경우 Err' 패닉 메시지가 포함 된 패닉 메시지가 포함 된 [또는] 패닉 콘텐츠를 생성합니다 ."

str::parse일반 함수 이므로 꺾쇠 괄호 안에있는 유형입니다.


9
변수 유형 ( let my_u8: u8) 을 지정하면 꺾쇠 괄호 안에 값이 필요하지 않습니다. 또한 일반적인 녹 스타일은 :왼쪽에 붙어 있어야 함을 나타냅니다 .
Shepmaster

5
구체적으로 말하자면let my_u32: u32 = "42".parse().unwrap()
Shepmaster

9

에서 문자열을 가져 오면 stdin().read_line먼저 다듬어야합니다.

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

6

최근 밤마다 다음과 같이 할 수 있습니다.

let my_int = from_str::<int>(&*my_string);

여기서 일어나는 일은 String이제로 참조 해제 될 수 있다는 것 str입니다. 그러나이 함수는를 원 &str하므로 다시 빌려야합니다. 참고로,이 특정 패턴 ( &*)을 "교차 차입"이라고합니다.


좋아, 나는 야간에 있지 않지만 실제로 String한 지점에서 역 참조를 시도하고 그것이 효과가 있기를 희망 했기 때문에 대답으로 받아 들일 것입니다.
mtahmed 2016

2
또는 다음 my_sttring.as_slice()과 같이 표현할 수 있습니다my_string[] (현재 slicing_syntax기능 게이트이지만, 대부분의 아마 어떤 형태의 언어로 끝날 것이다).
tempestadept


0

음 ... 아니. 왜 있어야합니까? 더 이상 필요하지 않으면 문자열을 폐기하십시오.

&strString문자열은 소유자가 아닌 원본 데이터에 대한보기 일 뿐이므로 문자열 만 읽어야 할 때보 다 유용합니다 . 보다 쉽게 ​​전달할 수 있으며 String복사 가능하므로 호출 된 메소드에서 사용되지 않습니다. 이와 관련하여 더 일반적입니다.가있는 경우 예상되는 String곳으로 전달할 수 &str있지만 가지고있는 경우 새로운 할당을 &str기대하는 함수에만 전달할 수 있습니다 String.

이 두 가지의 차이점과 공식 문자열 안내서 에서이 두 가지를 언제 사용해야하는지 더 자세히 알 수 있습니다 .


제 생각에는 왜 "있어야"하는가에 대한 명백한 이유 는 문자열 .as_slice()에서 할 필요가있을 때마다 할 필요가 없기 때문 from_str입니다. 예를 들어, 명령 행 인수는 from_str모든 인수에 대해 ints 등 으로 해석하기 위해 수행해야하는 한 곳입니다 .
mtahmed

as_slice()문자열 처리의 작은 측면 일뿐입니다. 예를 들어 슬라이싱 구문 ( s[])을 사용하거나 Deref강제 변환 ( &*s)을 사용할 수 있습니다 . 그냥 쓸 수있는 제안도 있습니다 &s.
Vladimir Matveev

우오! 무엇을 할 &s문자열을합니까? 그것은 줄 것이다 str다시? 제안을 알려 주시겠습니까?
mtahmed 2016

1
우선, str당신이 작업하는 것이 아닙니다. 입니다 &str. 그것들은 다릅니다 (그러나 관련이 있습니다). 전자는 거의 직접 사용하지 않는 동적 크기의 유형이고 후자는 지방 포인터 인 문자열 슬라이스입니다. 이 제안을 역 참조 강제 라고 합니다 . 그것은에서 강제 할 수 있도록 할 &T&U경우 T: Deref<U>. 때문에 String: Deref<str>이미, 당신은 얻을 수있을 것이다 &str로부터 String단지와 &. 아직 논의 중이지만 1.0 이전에 발생할 것으로 의심됩니다. 남은 시간이 너무 적습니다.
블라디미르 Matveev

-1

따라서 기본적으로 문자열을 정수로 변환하려고합니다! 여기에 내가 주로 사용하는 것이 있으며 공식 문서에도 언급되어 있습니다.

fn main() {

    let char = "23";
    let char : i32 = char.trim().parse().unwrap();
    println!("{}", char + 1);

}

이것은 String과 & str 모두에서 작동합니다. 이것이 도움이되기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.