char::to_digit în Rust

to_digit transformă o cifră ('7', 'f') în număr într-o bază dată; from_digit face invers. Ambele returnează Option.

Sintaxă
pub const fn to_digit(self, radix: u32) -> Option<u32>
pub const fn from_digit(num: u32, radix: u32) -> Option<char>

Ce face char::to_digit

c.to_digit(10) returnează Some(7) pentru '7' și None pentru orice nu este cifră în baza dată. Baza (radix) poate fi de la 2 la 36; în baza 16, 'a'–'f' și 'A'–'F' valorează 10–15.

char::from_digit(num, radix) face drumul invers: from_digit(7, 10) dă Some('7'), from_digit(11, 16) dă Some('b') (literă mică). Dacă numărul nu este mai mic decât baza, rezultatul este None. O bază mai mare decât 36 oprește programul cu panică la ambele funcții.

Parametri

Parametru Descriere
radix Baza de numerație, între 2 și 36.
num La from_digit: valoarea cifrei (0 ≤ num < radix).

Ce returnează

to_digit: Option<u32>. from_digit: Option<char>.

Exemple

Exemplul 1: Cifre în baza 10 și 16

fn main() {
    println!("{:?} {:?} {:?}", '7'.to_digit(10), 'f'.to_digit(16), 'F'.to_digit(16));
    println!("{:?} {:?}", 'g'.to_digit(16), '8'.to_digit(8));
    println!("{:?} {:?} {:?}", char::from_digit(7, 10), char::from_digit(11, 16), char::from_digit(10, 10));
}

Rezultat

Some(7) Some(15) Some(15)
None None
Some('7') Some('b') None

Exemplul 2: Cifra de control a unui CNP

Fiecare cifră din primele 12 se înmulțește cu cifra corespunzătoare din constanta 279146358279; restul împărțirii sumei la 11 este cifra de control (10 devine 1).

fn cifra_control(cnp: &str) -> Option<u32> {
    let cheie = "279146358279";
    let mut suma = 0;
    for (c, k) in cnp.chars().take(12).zip(cheie.chars()) {
        suma += c.to_digit(10)? * k.to_digit(10)?;
    }
    let rest = suma % 11;
    Some(if rest == 10 { 1 } else { rest })
}

fn main() {
    let cnp = "1960523221239";
    let control = cifra_control(cnp).unwrap();
    let ultima = cnp.chars().last().and_then(|c| c.to_digit(10)).unwrap();
    println!("cifra de control: {control}, în CNP: {ultima}, valid: {}", control == ultima);
    println!("cu literă: {:?}", cifra_control("19605232212X1"));
    println!("ca char: {:?}", char::from_digit(control, 10));
}

Rezultat

cifra de control: 9, în CNP: 9, valid: true
cu literă: None
ca char: Some('9')

Greșeli frecvente

  • Calculezi cifra cu c as u32 - 48. Merge doar pentru cifre ASCII și dă rezultate fără sens pentru alte caractere; to_digit verifică.
  • Te aștepți ca from_digit să dea litere mari în baza 16. Dă litere mici; pentru mari, adaugă to_ascii_uppercase().

Comenzi înrudite

  • char::is_numeric: is_numeric: orice caracter numeric Unicode (inclusiv ½, ², Ⅻ); is_ascii_digit: doar cifrele 0–9.
  • str::parse: Transformă textul într-o altă valoare (număr, bool, char, IP, tip propriu) și returnează Result.
  • char::from_u32: Creează un char din codul lui Unicode, dacă este valid; altfel returnează None.