i32::from_str_radix în Rust

Transformă un text în număr într-o bază aleasă (2 = binar, 16 = hexazecimal etc.).

Sintaxă
fn from_str_radix(src: &str, radix: u32) -> Result<i32, ParseIntError>

Ce face i32::from_str_radix

i32::from_str_radix("ff", 16) citește textul ca număr scris în baza 16 și returnează Ok(255). Baza poate fi între 2 și 36; după cifrele 0-9 se folosesc literele a-z (mari sau mici). Este acceptat un semn + sau - la început.

Prefixe ca 0x sau 0b nu sunt acceptate: taie-le înainte cu strip_prefix. Toate tipurile întregi au această funcție (u8::from_str_radix, u64::from_str_radix). Operația inversă, afișarea într-o bază, se face cu {:x}, {:X}, {:b}, {:o}.

Parametri

Parametru Descriere
src Textul de citit.
radix Baza: 2-36. O bază în afara intervalului produce panică.

Ce returnează

Result<i32, ParseIntError>.

Exemple

Exemplul 1: Binar, octal, hexazecimal

fn main() {
    println!("{:?}", i32::from_str_radix("1010", 2));
    println!("{:?}", i32::from_str_radix("777", 8));
    println!("{:?}", i32::from_str_radix("FF", 16));
    println!("{:?}", i32::from_str_radix("-7f", 16));
    println!("{:?}", i32::from_str_radix("rust", 36));
    println!("{:?}", i32::from_str_radix("0xFF", 16));
    println!("{:?}", i32::from_str_radix("102", 2));

    let n = 2026;
    println!("{n} = {n:b} (binar) = {n:o} (octal) = {n:X} (hex)");
}

Rezultat

Ok(10)
Ok(511)
Ok(255)
Ok(-127)
Ok(1299629)
Err(ParseIntError { kind: InvalidDigit })
Err(ParseIntError { kind: InvalidDigit })
2026 = 11111101010 (binar) = 3752 (octal) = 7EA (hex)

Exemplul 2: Culori HTML din hexazecimal

Fiecare pereche de cifre hex este o componentă de culoare, între 0 și 255.

fn rgb(culoare: &str) -> Result<(u8, u8, u8), String> {
    let hex = culoare.strip_prefix('#').ok_or("culoarea trebuie să înceapă cu #")?;
    if hex.len() != 6 {
        return Err(format!("„{culoare}” trebuie să aibă 6 cifre hex"));
    }
    let comp = |i: usize| u8::from_str_radix(&hex[i..i + 2], 16).map_err(|e| format!("„{culoare}”: {e}"));
    Ok((comp(0)?, comp(2)?, comp(4)?))
}

fn main() {
    for c in ["#FF8800", "#1e90ff", "#12345G", "00FF00"] {
        println!("{c}: {:?}", rgb(c));
    }
}

Rezultat

#FF8800: Ok((255, 136, 0))
#1e90ff: Ok((30, 144, 255))
#12345G: Err("„#12345G”: invalid digit found in string")
00FF00: Err("culoarea trebuie să înceapă cu #")

Greșeli frecvente

  • Dai textul cu prefix ("0xFF"): eroarea InvalidDigit. Elimină prefixul cu strip_prefix("0x").
  • Citești în i32 un număr hex mare, ca "FFFFFFFF": este 4294967295, peste i32::MAX, deci eroare PosOverflow. Folosește u32.

Comenzi înrudite

  • ParseIntError: Eroarea returnată când un text nu poate fi transformat în număr întreg; kind() spune motivul exact.
  • i32: Tipul implicit pentru numere întregi cu semn, pe 32 de biți: de la -2147483648 la 2147483647.
  • u8: Întreg fără semn pe 8 biți (0-255): tipul unui octet, folosit pentru date binare și text ASCII/UTF-8.
  • i32::count_ones: Numără biții de 1 din reprezentarea binară a numărului (de exemplu 0b1011 are 3).