pub fn max_value(mut n: isize, digit: char) -> Result { let digit = match digit.to_digit(10) { Some(d) => Ok(d as isize), None => Err("The digit is not valid"), }?; let negative = n < 0; if negative { n *= -1; } let nlen = (n.abs() as f32).log10().floor() as u32 + 1; let mut max = n * 10 + digit; let cmp = if negative { std::cmp::min } else { std::cmp::max }; for i in 1..=nlen { let option = (n / 10isize.pow(i) * 10 + digit) * 10isize.pow(i) + n % 10isize.pow(i); max = cmp(max, option); } Ok(if negative { -max } else { max }) }