| use std::time::Duration; |
|
|
| |
| |
| pub fn humanize_time(dt: chrono::DateTime<chrono::Utc>) -> String { |
| let duration = chrono::Utc::now().signed_duration_since(dt); |
| let duration = Duration::from_secs((duration.num_minutes() * 60).max(0) as u64); |
| if duration.is_zero() { |
| "now".to_string() |
| } else { |
| format!("{} ago", humantime::format_duration(duration)) |
| } |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| pub fn humanize_number(n: usize) -> String { |
| match n { |
| n if n >= 1_000_000_000 => format!("{:.1}B", n as f64 / 1_000_000_000.0), |
| n if n >= 1_000_000 => format!("{:.1}M", n as f64 / 1_000_000.0), |
| n if n >= 1_000 => format!("{:.1}k", n as f64 / 1_000.0), |
| _ => n.to_string(), |
| } |
| } |
|
|
| #[cfg(test)] |
| mod tests { |
| use pretty_assertions::assert_eq; |
|
|
| use super::*; |
|
|
| #[test] |
| fn test_humanize_number_billions() { |
| let actual = humanize_number(1_500_000_000); |
| let expected = "1.5B"; |
| assert_eq!(actual, expected); |
| } |
|
|
| #[test] |
| fn test_humanize_number_millions() { |
| let actual = humanize_number(2_300_000); |
| let expected = "2.3M"; |
| assert_eq!(actual, expected); |
| } |
|
|
| #[test] |
| fn test_humanize_number_thousands() { |
| let actual = humanize_number(4_500); |
| let expected = "4.5k"; |
| assert_eq!(actual, expected); |
| } |
|
|
| #[test] |
| fn test_humanize_number_small() { |
| let actual = humanize_number(999); |
| let expected = "999"; |
| assert_eq!(actual, expected); |
| } |
|
|
| #[test] |
| fn test_humanize_number_zero() { |
| let actual = humanize_number(0); |
| let expected = "0"; |
| assert_eq!(actual, expected); |
| } |
| } |
|
|