Rustで文字列をintに変換しますか?


186

注:この質問には、廃止された1.0より前のコードが含まれています。答えは正しいです。

Rustでaをに変換するstrにはint、次のようにします。

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

私がa Stringをan に変換する方法を知る唯一の方法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 2016

2
やや明白ですが、2014年以降にこの質問を見つけて、from_strがスコープにない理由を疑問視する人へのメモは、プレリュードにはありません。use std::str::FromStr;それを修正します。必要に応じて、from_strの詳細をご覧ください。doc.rust-lang.org/std/str/trait.FromStr.html#tymethod.from_str
7l-l04

回答:


259

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()返します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>戻りResult<u32, core::num::ParseIntError>およびResult::unwrap「アンラップ結果、コンテンツ降伏Ok値である場合、[OR]パニックErrによって提供パニックメッセージと、Errの値」。

str::parse汎用関数なので、山括弧で囲まれたタイプです。


9
変数のタイプ(let my_u8: u8)を指定する場合、山括弧内の値は不要です。また、一般的なRustスタイルは:、左側に固執する必要があることを示しています。
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、ある時点で実際にaを逆参照しようとし、それが機能することを望んでいたので、それを答えとして受け入れます。
mtahmed 2014年

2
または、次のように表現することもできます(現在は機能制限さmy_sttring.as_slice()れていますが、おそらく何らかの形で最終的には言語になります)。my_string[]slicing_syntax
tempestadept


0

うーん、ダメ。なぜあるべきなのか?不要になった文字列は破棄してください。

&strString文字列を読み取る必要がある場合よりも便利です。これは、文字列を所有者ではなく、元のデータの一部を表示するだけなのでです。はString、より簡単に渡すことができ、コピー可能であるため、呼び出されたメソッドによって消費されることはありません。この点で、より一般的です。がある場合Stringは、&strが期待される場所に渡すことができますが、がある場合は&strString新しい割り当てを行う場合に期待する関数にのみ渡すことができます。

これら2つの違いの詳細と、いつ使用するかについては、公式の文字列ガイドをご覧ください


ええと、私の意見では、「あるべき」の明白な理由は、文字列.as_slice()に対して実行する必要があるたびに実行する必要がないfrom_strということです。コマンドライン引数は、例えば、私がする必要がある一つの場所であるfrom_strとして、それらを解釈するために、すべての引数にintSなど
mtahmed

as_slice()文字列処理のごく一部です。たとえば、スライス構文(s[])を使用したり、Deref強制(&*s)を利用したりできます。ただ書くことを許可する提案さえあり&sます。
Vladimir Matveev

おおお!&s文字列はどうなりますか?それはstr背を向けますか?私にその提案を教えてもらえますか?
mtahmed 2014年

1
まず第一に、strあなたが取り組んでいるものではありません。です&str。それらは異なります(ただし、関連しています)。前者は動的サイズのタイプであり、直接使用することはほとんどありませんが、後者はファットポインターである文字列スライスです。この提案はderef強制と呼ばれます。if から&Tto に強制することができます。以来、すでに、あなたが得ることができるようになりますから、ただで。それはまだ議論中ですが、1.0より前に起こるとは思えません-残り時間がほとんどありません。&UT: Deref<U>String: Deref<str>&strString&
Vladimir 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.