1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
pub trait DigitUtils { fn digit(self) -> u32; fn leftmost_digit(self) -> u8; fn rightmost_digit(self) -> u8; } macro_rules! impl_digit_utils(($($ty:ty),*) => { $( impl DigitUtils for $ty { fn digit(self) -> u32 { (self as f64).log10().trunc() as u32 + 1 } fn leftmost_digit(self) -> u8 { let digit = self.digit() - 1; (self / (10 as $ty).pow(digit)) as u8 } fn rightmost_digit(self) -> u8 { (self % 10) as u8 } } )* }); impl_digit_utils!(u64, u32, i64, i32, usize, isize); #[cfg(test)] mod tests { use super::*; #[test] fn u64_utils_test() -> () { assert_eq!(1u64.digit(), 1); assert_eq!(12u64.digit(), 2); assert_eq!(1u64.leftmost_digit(), 1); assert_eq!(200u64.leftmost_digit(), 2); assert_eq!(10u64.rightmost_digit(), 0); assert_eq!(202u64.rightmost_digit(), 2); } #[test] fn u32_utils_test() -> () { assert_eq!(1u32.digit(), 1); assert_eq!(12u32.digit(), 2); assert_eq!(1u32.leftmost_digit(), 1); assert_eq!(200u32.leftmost_digit(), 2); assert_eq!(10u32.rightmost_digit(), 0); assert_eq!(202u32.rightmost_digit(), 2); } #[test] fn i64_utils_test() -> () { assert_eq!(1i64.digit(), 1); assert_eq!(12i64.digit(), 2); assert_eq!(1i64.leftmost_digit(), 1); assert_eq!(200i64.leftmost_digit(), 2); assert_eq!(10i64.rightmost_digit(), 0); assert_eq!(202i64.rightmost_digit(), 2); } #[test] fn i32_utils_test() -> () { assert_eq!(1i32.digit(), 1); assert_eq!(12i32.digit(), 2); assert_eq!(1i32.leftmost_digit(), 1); assert_eq!(200i32.leftmost_digit(), 2); assert_eq!(10i32.rightmost_digit(), 0); assert_eq!(202i32.rightmost_digit(), 2); } #[test] fn usize_utils_test() -> () { assert_eq!(1usize.digit(), 1); assert_eq!(12usize.digit(), 2); assert_eq!(1usize.leftmost_digit(), 1); assert_eq!(200usize.leftmost_digit(), 2); assert_eq!(10usize.rightmost_digit(), 0); assert_eq!(202usize.rightmost_digit(), 2); } #[test] fn isize_utils_test() -> () { assert_eq!(1isize.digit(), 1); assert_eq!(12isize.digit(), 2); assert_eq!(1isize.leftmost_digit(), 1); assert_eq!(200isize.leftmost_digit(), 2); assert_eq!(10isize.rightmost_digit(), 0); assert_eq!(202isize.rightmost_digit(), 2); } }