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
use std::str::FromStr; pub fn find_decimal<N: FromStr>(slice: &[char]) -> Option<(N, usize)> { let mut decimal = false; let (mut end, negative) = { if matches!(slice, ['-', ..]) { (1, true) } else { (0, false) } }; for ch in slice[end..].iter() { match ch { '0'..='9' => { end += 1; } '.' if !decimal => { decimal = true; end += 1; } _ => break, } } if end > negative as usize && slice[end - 1] == '.' { end -= 1; } if end > negative as usize { Some(( slice[..end].iter() .collect::<String>() .parse() .ok()?, end, )) } else { None } } pub fn find_integer<N: FromStr>(slice: &[char]) -> Option<(N, usize)> { let negative: bool = matches!(slice, ['-', ..]); let end: usize = negative as usize + slice[negative as usize..].iter() .take_while(|&&n| '0' <= n && n <= '9') .count(); if end > negative as usize { Some(( slice[..end].iter() .collect::<String>() .parse() .ok()?, end, )) } else { None } } pub fn find_integer_positive<N: FromStr>(slice: &[char]) -> Option<(N, usize)> { let end: usize = slice.iter() .take_while(|&&n| '0' <= n && n <= '9') .count(); if end > 0 { Some(( slice[..end].iter() .collect::<String>() .parse() .ok()?, end, )) } else { None } }