use chrono::SecondsFormat;
pub fn price(v: f64) -> String {
let r = (v * 1000.0).round() / 1000.0;
let s = format!("{r}");
if let Some(int_part) = s.strip_suffix(".0") {
return int_part.to_string();
}
if s.contains('.') {
let trimmed = s.trim_end_matches('0').trim_end_matches('.');
return trimmed.to_string();
}
s
}
pub fn volume(v: f64) -> String {
price(v)
}
pub fn pct(v: f64) -> String {
let r = (v * 100.0).round() / 100.0;
format!("{r:+.2}")
}
pub fn price_tick(v: f64) -> String {
format!("{v:.4}")
}
pub fn time_hms_millis(dt_ns: Option<i64>) -> String {
dt_ns
.map(|ns| {
chrono::DateTime::<chrono::Utc>::from_timestamp_nanos(ns)
.with_timezone(&crate::state::beijing_tz())
.to_rfc3339_opts(SecondsFormat::Millis, false)
.chars()
.skip(11)
.take(12)
.collect()
})
.unwrap_or_else(|| "-".to_string())
}
pub fn date_ymd(dt_ns: Option<i64>) -> String {
dt_ns
.map(|ns| {
chrono::DateTime::<chrono::Utc>::from_timestamp_nanos(ns)
.with_timezone(&crate::state::beijing_tz())
.format("%Y-%m-%d")
.to_string()
})
.unwrap_or_else(|| "-".to_string())
}