pub fn uses_decimal_comma(txt: &str, enforce_euro_mode: bool) -> bool {
let chs = txt.char_indices();
let mut num_indices = 0;
let mut dot_pos: Option<usize> = None;
let mut num_dots = 0;
let mut num_commas = 0;
let mut comma_pos: Option<usize> = None;
for (index, ch) in chs {
match ch {
'.' => {
if dot_pos.is_none() {
dot_pos = Some(index);
}
num_dots += 1;
}
',' => {
if comma_pos.is_none() {
comma_pos = Some(index);
}
num_commas += 1;
}
_ => (),
}
num_indices += 1; }
if let Some(d_pos) = dot_pos {
if let Some(c_pos) = comma_pos {
d_pos < c_pos
} else {
num_dots > 1 || enforce_euro_mode
}
} else {
if let Some(c_pos) = comma_pos {
if num_commas > 1 {
false
} else {
num_indices - c_pos != 4 || enforce_euro_mode
}
} else {
false
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_number_format_1() {
let sample = "1.256";
assert_eq!(uses_decimal_comma(sample, false), false);
}
#[test]
fn test_number_format_2() {
let sample = "1,256";
assert_eq!(uses_decimal_comma(sample, false), false);
}
#[test]
fn test_number_format_3() {
let sample = "12,56";
assert_eq!(uses_decimal_comma(sample, false), true);
}
#[test]
fn test_number_format_4() {
let sample = "1,256.67";
assert_eq!(uses_decimal_comma(sample, false), false);
}
#[test]
fn test_number_format_5() {
let sample = "1.256,67";
assert_eq!(uses_decimal_comma(sample, false), true);
}
}