a1_notation/column/
display.rs

1use crate::{Column, ALPHA};
2use std::fmt;
3
4impl fmt::Display for Column {
5    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
6        // Convert to the "A" part - 0 == 'A', 1 == 'B', etc.  we'll append to a string because
7        // if it's larger than 26, we'll have additional characters like AA1
8        let mut row_part = String::from("");
9        let mut c = self.x;
10
11        loop {
12            row_part = format!("{}{}", ALPHA[c % 26], row_part);
13
14            let next_c = ((c as f64 / 26.0).floor() as isize) - 1;
15            if next_c < 0 {
16                break;
17            }
18
19            c = next_c as usize;
20        }
21
22        let abs_char = if self.absolute { "$" } else { "" };
23
24        write!(f, "{abs_char}{row_part}")
25    }
26}
27
28#[cfg(test)]
29mod tests {
30    use crate::*;
31
32    #[test]
33    fn display_relative() {
34        assert_eq!(Column::new(0).to_string(), "A");
35        assert_eq!(Column::new(1).to_string(), "B");
36        assert_eq!(Column::new(2).to_string(), "C");
37        assert_eq!(Column::new(25).to_string(), "Z");
38        assert_eq!(Column::new(26).to_string(), "AA");
39    }
40
41    #[test]
42    fn display_absolute() {
43        assert_eq!(
44            Column {
45                absolute: true,
46                x: 0
47            }
48            .to_string(),
49            "$A"
50        );
51        assert_eq!(
52            Column {
53                absolute: true,
54                x: 25
55            }
56            .to_string(),
57            "$Z"
58        );
59    }
60}