a1_notation/column/
display.rs1use crate::{Column, ALPHA};
2use std::fmt;
3
4impl fmt::Display for Column {
5 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
6 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}