Convertiți un șir de caractere în int? (Programare, Rust)

mmtauqir a intrebat.

Notă: această întrebare conține cod depreciat pre-1.0! Totuși, răspunsul este corect.

Pentru a converti un str în int în Rust, pot face acest lucru:

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

Singura modalitate pe care o știu pentru a converti un String în an int este de a obține o felie din el și apoi de a folosi from_str pe el, astfel:

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

Există o modalitate de a converti direct un String în an int?

Comentarii

  • A se vedea, de asemenea: stackoverflow.com/q/3238141414/500207 pentru non-decimal (adică hexagonal). –  > Por Ahmed Fasih.
  • Oarecum evident, dar o notă pentru oricine găsește această întrebare mult după 2014 și se întreabă de ce from_str nu este în domeniul de aplicare, nu este în preludiu. use std::str::FromStr; remediază acest lucru. Mai multe despre from_str, dacă doriți. doc.rust-lang.org/std/str/trait.FromStr.html#tymethod.from_str –  > Por cryptograthor.
7 răspunsuri
John Vrbanac

Puteți converti direct la un int folosind metoda str::parse::<T>() metoda.

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

Puteți fie să specificați tipul în care să faceți analiza cu ajutorul operatorului turbofish (::<>), așa cum se arată mai sus, fie prin intermediul adnotării explicite a tipului:

let my_int: i32 = my_string.parse().unwrap();

După cum se menționează în comentarii, parse() returnează un Result. Acest rezultat va fi un Err dacă șirul de caractere nu a putut fi analizat ca fiind de tipul specificat (de exemplu, șirul de caractere "peter" nu poate fi analizat ca i32).

Comentarii

    42

  • Rețineți că parse returnează un Result, deci trebuie să vă ocupați de acesta în mod corespunzător pentru a ajunge la un tip integral real. –  > Por Shepmaster.
  • Acest lucru este foarte util dacă știți deja cum să vă ocupați de Rezultate. Vă sugerez să extindeți răspunsul pentru a se potrivi oricui nu știe. –  > Por Josh Vander Hook.
Jared Beck
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> returnează un Result<u32, core::num::ParseIntError> și Result::unwrap „Desfășoară un rezultat, oferind conținutul unui Ok [sau] intră în panică dacă valoarea este un Err, cu un mesaj de panică furnizat de către Err‘s value.”

str::parse este un funcție generică, de unde și tipul între paranteze unghiulare.

Comentarii

  • Dacă specificați tipul variabilei (let my_u8: u8), atunci nu aveți nevoie de valoarea din paranteze unghiulare. De asemenea, rețineți că stilul Rust predominant indică faptul că : ar trebui să rămână în partea stângă. –  > Por Shepmaster.
  • În mod specific, am vrut să spun let my_u32: u32 = "42".parse().unwrap() –  > Por Shepmaster.
Ade Yahya

Dacă îți iei șirul de la stdin().read_line, trebuie să îl tăiați mai întâi.

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

DK.

Cu un nightly recent, puteți face acest lucru:

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

Ceea ce se întâmplă aici este că String poate fi acum redirecționat într-un str. Cu toate acestea, funcția dorește un &str, așa că trebuie să împrumutăm din nou. Pentru referință, cred că acest model special (&*) se numește „cross-borrowing”.

Comentarii

  • Bine, nu sunt pe nightlies, dar îl voi accepta ca răspuns, deoarece am încercat de fapt să fac dereferențierea unui String la un moment dat și am sperat că va funcționa. –  > Por mmtauqir.
  • Alternativ, puteți exprima my_sttring.as_slice() ca my_string[] (în prezent slicing_syntax nu este prevăzut pentru caracteristici, dar cel mai probabil o formă a acestuia va ajunge în limbaj). –  > Por tempestadept.
Karthik Cherukuri

Puteți utiliza FromStr trăsătura from_str care este implementată pentru i32:

let my_num = i32::from_str("9").unwrap_or(0);

Vladimir Matveev

Ei bine, nu. De ce ar trebui să existe? Pur și simplu aruncați șirul dacă nu mai aveți nevoie de el.

&str este mai util decât String atunci când aveți nevoie doar să citiți un șir de caractere, deoarece este doar o vedere în bucata originală de date, nu și în proprietarul acesteia. Puteți să o transmiteți mai ușor decât String, și este copiabil, astfel încât nu este consumat de metodele invocate. În această privință, este mai general: dacă aveți un fișier String, îl puteți trece în cazul în care un &str este așteptat, dar dacă aveți &str, îl puteți trece doar la funcțiile care așteaptă String dacă faceți o nouă alocare.

Puteți găsi mai multe despre diferențele dintre acestea două și când să le folosiți în manualul ghidul oficial al șirurilor de caractere.

Comentarii

  • Ei bine, un motiv evident pentru care „ar trebui să existe”, în opinia mea, este că nu ar trebui să fac .as_slice() de fiecare dată când trebuie să fac from_str pe un String. Argumentele din linia de comandă, de exemplu, este un loc în care trebuie să fac from_str pe toate argumentele pentru a le interpreta ca fiind ints etc. –  > Por mmtauqir.
  • as_slice() este doar un aspect minor al manipulării șirurilor de caractere. De exemplu, puteți utiliza sintaxa de feliere (s[]) sau să exploatați Deref coerciția (&*s). Există chiar și o propunere care ar permite scrierea doar &s. –  > Por Vladimir Matveev.
  • Ooooh! Ce ar &s face pentru un șir? Ar da un str spate? Puteți să-mi indicați propunerea? –  > Por mmtauqir.
  • În primul rând, str nu este ceea ce lucrați; este &str. Ele sunt diferite (dar legate). Primul este un tip dimensionat dinamic pe care aproape niciodată nu l-ai folosi direct, în timp ce al doilea este o felie de șir de caractere care este un pointer gras. Propunerea se numește deref coercions; aceasta ar permite să se efectueze coerciția de la &T la &U dacă T: Deref<U>. Deoarece String: Deref<str> deja, se va putea obține &str de la String doar cu &. Este încă în discuție, dar mă îndoiesc că se va întâmpla înainte de 1.0 – a mai rămas prea puțin timp. –  > Por Vladimir Matveev.
Taimoor

Deci, în esență, vrei să convertești un șir de caractere într-un întreg, corect!Iată ce folosesc eu cel mai des și care este menționat și în documentația oficială…

fn main() {

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

}

Acest lucru funcționează atât pentru String cât și pentru &str Sper că vă va fi de ajutor.

Tags: