pub fn percent(slider: egui::Slider<'_>) -> egui::Slider<'_> {
slider
.custom_formatter(|value, _| format!("{:.0} %", value * 100.0))
.custom_parser(parse_percent)
}
fn parse_percent(text: &str) -> Option<f64> {
text.trim()
.trim_end_matches('%')
.trim()
.parse::<f64>()
.ok()
.map(|value| value / 100.0)
}
#[cfg(test)]
mod tests {
use super::parse_percent;
#[test]
fn percent_text_parses_back_to_a_fraction() {
assert_eq!(parse_percent("40"), Some(0.4));
assert_eq!(parse_percent("40 %"), Some(0.4));
assert_eq!(parse_percent(" 100%"), Some(1.0));
assert_eq!(parse_percent("x"), None);
}
}