Ce face str::parse
parse citește textul și încearcă să-l transforme în tipul cerut. Tipul se dă fie la variabilă (let n: i32 = s.parse()?), fie cu „turbofish” (s.parse::<f64>()). Funcționează pentru orice tip care implementează FromStr: toate numerele, bool, char, String, adrese IP și tipurile tale.
Rezultatul este un Result: Ok(valoare) sau Err cu motivul. Textul nu trebuie să conțină spații în plus (aplică trim()), iar numerele zecimale folosesc punct, nu virgulă: "4,50" nu este un f64 valid.
Ce returnează
Result<F, F::Err>; pentru numere eroarea este ParseIntError sau ParseFloatError.
Exemple
Exemplul 1: Numere, bool și erori
fn main() {
let a: i32 = "-17".parse().unwrap();
let b = "3.75".parse::<f64>().unwrap();
let c: bool = "true".parse().unwrap();
println!("{a} {b} {c}");
println!("{:?}", "12a".parse::<i32>());
println!("{:?}", "".parse::<u8>());
println!("{:?}", "300".parse::<u8>());
println!("{:?}", "4,50".parse::<f64>());
println!("{:?}", " 7".parse::<i32>());
}
Rezultat
-17 3.75 true
Err(ParseIntError { kind: InvalidDigit })
Err(ParseIntError { kind: Empty })
Err(ParseIntError { kind: PosOverflow })
Err(ParseFloatError { kind: Invalid })
Err(ParseIntError { kind: InvalidDigit })
Exemplul 2: Mesaje prietenoase pentru erori
fn pret(text: &str) -> Result<f64, String> {
let curat = text.trim().replace(',', ".");
curat.parse::<f64>().map_err(|e| format!("„{text}” nu este un preț valid ({e})"))
}
fn main() {
for t in ["12,50", " 7 ", "zece"] {
match pret(t) {
Ok(p) => println!("preț: {p:.2} lei"),
Err(e) => println!("eroare: {e}"),
}
}
}
Rezultat
preț: 12.50 lei
preț: 7.00 lei
eroare: „zece” nu este un preț valid (invalid float literal)
Greșeli frecvente
- Nu dai tipul:
let x = s.parse().unwrap();dătype annotations needed. Scrielet x: u32sauparse::<u32>(). - Uiți
trim()dupăread_line:"28\n"dăinvalid digit found in string.
Comenzi înrudite
FromStr: Trait-ul care face un tip „citibil” din text; după implementare, „…”.parse::<Tip>() funcționează.str::trim: Elimină spațiile albe de la ambele capete (trim), doar de la început (trim_start) sau doar de la final (trim_end).str::split_whitespace: Împarte textul în cuvinte, la orice spațiu alb (spații, tab, linie nouă), fără bucăți goale.char::to_digit: to_digit transformă o cifră (‘7’, ‘f’) în număr într-o bază dată; from_digit face invers. Ambele returnează Option.