1#[inline(always)]
16pub const fn char_to_valid_digit_const(c: u8, radix: u32) -> u32 {
17 if radix <= 10 {
18 (c.wrapping_sub(b'0')) as u32
20 } else {
21 let digit = match c {
23 b'0'..=b'9' => c - b'0',
24 b'A'..=b'Z' => c - b'A' + 10,
25 b'a'..=b'z' => c - b'a' + 10,
26 _ => 0xFF,
27 };
28 digit as u32
29 }
30}
31
32#[inline(always)]
37pub const fn char_to_digit_const(c: u8, radix: u32) -> Option<u32> {
38 let digit = char_to_valid_digit_const(c, radix);
39 if digit < radix {
40 Some(digit)
41 } else {
42 None
43 }
44}
45
46#[inline(always)]
48pub const fn char_is_digit_const(c: u8, radix: u32) -> bool {
49 char_to_digit_const(c, radix).is_some()
50}
51
52#[inline(always)]
57#[cfg(any(feature = "parse-floats", feature = "write-floats", feature = "write-integers"))]
58pub const fn digit_to_char_const(digit: u32, radix: u32) -> u8 {
59 if radix <= 10 || digit < 10 {
60 digit as u8 + b'0'
62 } else {
63 digit as u8 + b'A' - 10
64 }
65}
66
67#[inline(always)]
76#[cfg(any(feature = "parse-floats", feature = "parse-integers"))]
77pub const fn char_to_digit(c: u8, radix: u32) -> Option<u32> {
78 let digit = match c {
80 b'0'..=b'9' => c - b'0',
81 b'A'..=b'Z' => c - b'A' + 10,
82 b'a'..=b'z' => c - b'a' + 10,
83 _ => 0xFF,
84 } as u32;
85 if digit < radix {
86 Some(digit)
87 } else {
88 None
89 }
90}
91
92#[inline(always)]
94#[cfg(any(feature = "parse-floats", feature = "parse-integers"))]
95pub const fn char_is_digit(c: u8, radix: u32) -> bool {
96 char_to_digit(c, radix).is_some()
97}
98
99#[inline(always)]
106#[cfg(any(feature = "write-floats", feature = "write-integers"))]
107pub fn digit_to_char(digit: u32) -> u8 {
108 const TABLE: [u8; 36] = [
109 b'0', b'1', b'2', b'3', b'4', b'5', b'6', b'7', b'8', b'9', b'A', b'B', b'C', b'D', b'E',
110 b'F', b'G', b'H', b'I', b'J', b'K', b'L', b'M', b'N', b'O', b'P', b'Q', b'R', b'S', b'T',
111 b'U', b'V', b'W', b'X', b'Y', b'Z',
112 ];
113 debug_assert!(digit < 36, "digit_to_char() invalid character.");
114 TABLE[digit as usize]
115}