···44pub mod grid;
55pub mod line;
66pub mod misc;
77+pub mod num;
78pub mod pos;
89pub mod range;
910···1617 pub use crate::grid::*;
1718 pub use crate::line::*;
1819 pub use crate::misc::*;
2020+ pub use crate::num::*;
1921 pub use crate::pos::*;
2022 pub use crate::range::*;
2123}
+66
utils/src/num.rs
···11+/// Gets the number of digits in a given number mathematically
22+///
33+/// # Examples
44+///
55+/// ```
66+/// use utils::prelude::*;
77+///
88+/// let my_num = 2226;
99+/// assert_eq!(num_digits(my_num), 4);
1010+/// ```
1111+///
1212+/// ```
1313+/// use utils::prelude::*;
1414+///
1515+/// let my_num = 120938747;
1616+/// assert_eq!(num_digits(my_num), 9);
1717+/// ```
1818+///
1919+/// ```
2020+/// use utils::prelude::*;
2121+///
2222+/// assert_eq!(num_digits(0), 1);
2323+/// ```
2424+///
2525+pub fn num_digits(num: usize) -> usize {
2626+ num.checked_ilog10().map(|x| x as usize).unwrap_or(0) + 1
2727+}
2828+2929+/// Split a given number at a specific digit, this digit will be included in the right-hand side
3030+/// and excluded in the left.
3131+///
3232+/// If the split is invalid, zero may be returnd on either side of the result.
3333+///
3434+/// # Examples
3535+///
3636+/// ```
3737+/// use utils::prelude::*;
3838+///
3939+/// let my_num = 123456;
4040+/// let (left, right) = split_num_at(my_num, 3);
4141+/// assert_eq!(left, 123);
4242+/// assert_eq!(right, 456);
4343+/// ```
4444+///
4545+pub fn split_num_at(num: usize, idx: u32) -> (usize, usize) {
4646+ let div = 10_usize.pow(idx);
4747+ (num / div, num % div)
4848+}
4949+5050+/// Split the given number once in the middle, see [[split_num_at]] for caveats.
5151+///
5252+/// # Examples
5353+///
5454+/// ```
5555+/// use utils::prelude::*;
5656+///
5757+/// let my_num = 55556666;
5858+/// let (left, right) = split_num_once(my_num);
5959+/// assert_eq!(left, 5555);
6060+/// assert_eq!(right, 6666);
6161+/// ```
6262+///
6363+pub fn split_num_once(num: usize) -> (usize, usize) {
6464+ let digits = num_digits(num);
6565+ split_num_at(num, (digits / 2) as u32)
6666+}