1use crate::data::Value;
9
10pub use crate::locale::{CurrencyPosition, Locale};
11pub use crate::scale::format::{
12 label_bytes, label_comma, label_comma_locale, label_comma_marks, label_currency,
13 label_currency_locale, label_currency_marks, label_dollar, label_number, label_number_locale,
14 label_number_marks, label_ordinal, label_percent, label_percent_locale, label_percent_marks,
15 label_scientific, label_si, LabelFormatter,
16};
17
18pub fn format_value(v: &Value) -> String {
33 match v {
34 Value::Str(s) => s.clone(),
35 Value::Bool(b) => b.to_string(),
36 Value::Na => String::new(),
37 Value::DateTime(secs) => crate::data::format_epoch_secs(*secs),
39 _ => v
40 .as_f64()
41 .map(|f| format!("{}", (f * 1000.0).round() / 1000.0))
42 .unwrap_or_default(),
43 }
44}
45
46pub fn format_value_locale(v: &Value, locale: &Locale) -> String {
57 match v {
58 Value::DateTime(secs) => locale.format_datetime(*secs),
59 Value::Str(_) | Value::Bool(_) | Value::Na => format_value(v),
60 _ => locale.localize_number(&format_value(v)),
61 }
62}
63
64#[cfg(test)]
65mod tests {
66 use super::*;
67
68 #[test]
69 fn formats_each_variant() {
70 assert_eq!(format_value(&Value::Str("a<b".into())), "a<b");
71 assert_eq!(format_value(&Value::Bool(true)), "true");
72 assert_eq!(format_value(&Value::Integer(-42)), "-42");
73 assert_eq!(format_value(&Value::Float(2.0)), "2");
74 assert_eq!(format_value(&Value::Float(0.12345)), "0.123");
75 assert_eq!(format_value(&Value::DateTime(3_661)), "1970-01-01 01:01:01");
76 assert_eq!(format_value(&Value::Na), "");
77 }
78
79 #[test]
80 fn formats_each_variant_with_locale() {
81 let de = Locale::de_de();
82 assert_eq!(format_value_locale(&Value::Str("1.5".into()), &de), "1.5");
83 assert_eq!(format_value_locale(&Value::Integer(-4200), &de), "-4.200");
84 assert_eq!(format_value_locale(&Value::Float(0.5), &de), "0,5");
85 assert_eq!(format_value_locale(&Value::Na, &de), "");
86 assert_eq!(
87 format_value_locale(&Value::DateTime(1_792_022_400), &Locale::en_us()),
88 "Oct 15, 2026"
89 );
90 assert_eq!(
91 format_value_locale(&Value::Float(1234.5), &Locale::en_us()),
92 "1,234.5"
93 );
94 }
95}