Lavorando con le griglie capita spesso di trovarsi in una situazione in cui le righe vengono rappresentate con dei numeri e le colonne con delle lettere. In un processo di automazione, mentre è semplice numerare i numeri appare più complessa l’operazione sulle lettere. Infatti, ad esempio, dopo la lettera Z si trova AB e così via…
Un procedimento come questo non funzionerà, poichè nella tabella ASCII il numero 27 corrisponde al simbolo “[“:
int number = 27; Console.WriteLine((char)('A' + number));
Una soluzione semplice
Le varie soluzioni che si possono proporre si dividono fra quelle che includono un dizionario e quelle matematiche. Propongo la soluzione matematica scritta in C# che utilizza il concetto di resto:
private string IntToLetters(int num) { string result = string.Empty; while (num >= 0) { result = (char)('A' + num % 26) + result; num /= 26; num--; } return num; }
Il metodo parte da 0 (dove A => 0) e procede all’infinito. Ovviamente è possibile anche effettuare l’operazione inversa, anche se la logica è un po’ più complessa:
private static int LettersToInt(string value) { int result = 0; List<char> digits = new List<char>("ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray()); char[] chars = value.ToUpper().ToCharArray(); int weight = chars.Length; for (int position = 0; position < chars.Length; position++) { int currentVal = digits.FindIndex(x => x == chars[position]); weight = chars.Length - position; int r = (weight - 1) * (currentVal + 1) * 26 + currentVal; result += r; } return result; }
…Devo ammettere che ci ho messo un bel po’ per ricavare la funzione qui sopra 🙂