pub fn column_number_to_name(col_num: u32) -> String {
let mut col_name_reversed = String::new();
let mut col_num = col_num + 1;
while col_num > 0 {
let mut remainder = col_num % 26;
if remainder == 0 {
remainder = 26;
}
let col_letter = char::from_u32('A' as u32 - 1 + remainder).unwrap();
col_name_reversed.push(col_letter);
col_num = (col_num - 1) / 26;
}
col_name_reversed.chars().rev().collect()
}
pub fn column_name_to_number(column: &str) -> u32 {
assert!(column.is_ascii());
let mut col_num = 0;
for char in column.chars() {
col_num = (col_num * 26) + (char as u32 - 'A' as u32 + 1);
}
col_num - 1
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_column_number_to_name() {
assert_eq!(column_number_to_name(0), "A");
assert_eq!(column_number_to_name(1), "B");
assert_eq!(column_number_to_name(25), "Z");
assert_eq!(column_number_to_name(26), "AA");
assert_eq!(column_number_to_name(27), "AB");
assert_eq!(column_number_to_name(51), "AZ");
assert_eq!(column_number_to_name(52), "BA");
assert_eq!(column_number_to_name(53), "BB");
assert_eq!(column_number_to_name(701), "ZZ");
assert_eq!(column_number_to_name(702), "AAA");
assert_eq!(column_number_to_name(703), "AAB");
}
#[test]
fn test_column_name_to_number() {
assert_eq!(column_name_to_number("A"), 0);
assert_eq!(column_name_to_number("B"), 1);
assert_eq!(column_name_to_number("Z"), 25);
assert_eq!(column_name_to_number("AA"), 26);
assert_eq!(column_name_to_number("AB"), 27);
assert_eq!(column_name_to_number("AZ"), 51);
assert_eq!(column_name_to_number("BA"), 52);
assert_eq!(column_name_to_number("BB"), 53);
assert_eq!(column_name_to_number("ZZ"), 701);
assert_eq!(column_name_to_number("AAA"), 702);
assert_eq!(column_name_to_number("AAB"), 703);
}
}