vault_audit_tools/utils/
format.rs

1//! Number and text formatting utilities.
2//!
3//! This module provides common formatting functions used across commands
4//! for consistent output presentation.
5
6/// Formats a number with comma separators for thousands.
7///
8/// # Examples
9///
10/// ```
11/// use vault_audit_tools::utils::format::format_number;
12///
13/// assert_eq!(format_number(1234), "1,234");
14/// assert_eq!(format_number(1234567), "1,234,567");
15/// assert_eq!(format_number(42), "42");
16/// ```
17pub fn format_number(n: usize) -> String {
18    let s = n.to_string();
19    let mut result = String::new();
20    for (i, c) in s.chars().rev().enumerate() {
21        if i > 0 && i % 3 == 0 {
22            result.push(',');
23        }
24        result.push(c);
25    }
26    result.chars().rev().collect()
27}
28
29#[cfg(test)]
30mod tests {
31    use super::*;
32
33    #[test]
34    fn test_format_number() {
35        assert_eq!(format_number(0), "0");
36        assert_eq!(format_number(1), "1");
37        assert_eq!(format_number(12), "12");
38        assert_eq!(format_number(123), "123");
39        assert_eq!(format_number(1234), "1,234");
40        assert_eq!(format_number(12345), "12,345");
41        assert_eq!(format_number(123_456), "123,456");
42        assert_eq!(format_number(1_234_567), "1,234,567");
43        assert_eq!(format_number(12_345_678), "12,345,678");
44        assert_eq!(format_number(123_456_789), "123,456,789");
45        assert_eq!(format_number(1_000_000_000), "1,000,000,000");
46    }
47
48    #[test]
49    fn test_format_number_large() {
50        assert_eq!(
51            format_number(usize::MAX),
52            format!("{:}", usize::MAX)
53                .chars()
54                .rev()
55                .enumerate()
56                .fold(String::new(), |mut acc, (i, c)| {
57                    if i > 0 && i % 3 == 0 {
58                        acc.push(',');
59                    }
60                    acc.push(c);
61                    acc
62                })
63                .chars()
64                .rev()
65                .collect::<String>()
66        );
67    }
68}