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_digitverifică. - Te aștepți ca
from_digitsă 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.