mod number;
mod date;
pub use number::NumberFormatter;
pub use date::{DateFormatter, detect_date_format, reformat_date_label};
pub fn format_value(value: f64, format_str: Option<&str>) -> String {
match format_str {
Some(fmt) => NumberFormatter::new(fmt).format(value),
None => default_format_value(value),
}
}
pub fn default_format_value(value: f64) -> String {
if value == value.floor() && value.abs() < 1e15 {
let abs = value.abs() as u64;
let formatted = number::insert_commas(&abs.to_string());
if value < 0.0 {
format!("-{}", formatted)
} else {
formatted
}
} else {
let abs_val = value.abs();
let precision = if abs_val < 1e-15 {
1usize
} else if abs_val >= 1.0 {
1usize
} else {
let digits = -(abs_val.log10().floor()) as usize;
digits.max(1)
};
let formatted = format!("{:.prec$}", value, prec = precision);
let trimmed = formatted.trim_end_matches('0');
if trimmed.ends_with('.') {
format!("{}0", trimmed)
} else {
trimmed.to_string()
}
}
}