#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub struct Locale;
impl Locale {
pub const fn invariant() -> Self {
Locale
}
pub fn parse_number_invariant(&self, s: &str) -> Option<f64> {
let trimmed = s.trim();
if let Some(without_pct) = trimmed.strip_suffix('%') {
let n = without_pct.trim().parse::<f64>().ok()?;
Some(n / 100.0)
} else {
trimmed.parse::<f64>().ok()
}
}
pub fn fold_case_invariant(&self, s: &str) -> String {
s.to_ascii_lowercase()
}
}
#[cfg(test)]
mod tests {
use super::Locale;
#[test]
fn parse_number_invariant_supports_percent_suffix() {
let loc = Locale::invariant();
assert_eq!(loc.parse_number_invariant("90%"), Some(0.9));
assert_eq!(loc.parse_number_invariant(" 90.5% "), Some(0.905));
assert_eq!(loc.parse_number_invariant("90 %"), Some(0.9));
}
#[test]
fn parse_number_invariant_rejects_invalid_percent_text() {
let loc = Locale::invariant();
assert_eq!(loc.parse_number_invariant("abc%"), None);
assert_eq!(loc.parse_number_invariant("%"), None);
assert_eq!(loc.parse_number_invariant("90% trailing"), None);
}
}