Estoy tratando de crear una función que me dé la posición del alfabeto cuando se pasa un índice. Será lo mismo que Excel muestra sus columnas. A ... Z, AA, AB .... Me escribió la función siguiente para obtener los resultados upto Z. Parece queIncrementando los alfabetos
static string GetColumnName(int index)
{
const int alphabetsCount = 26;
if (index <= alphabetsCount)
{
int code = (index - 1) + (int)'A';
return char.ConvertFromUtf32(code);
}
return string.Empty;
}
Esto funciona bien hasta que 'Z'. Devuelve 'A' si paso 1 y devuelve 'B' si paso 2 y así sucesivamente. Pero, no puedo averiguar cómo obtendré AA cuando pase 27 a esta función. Supongo que necesito un método recursivo para encontrarlo.
¡Cualquier entrada a este problema será genial!
Editar
Esto es sugerido por Tordek. Pero su código fallará en números como 52, 78, etc. Se agregó una solución para eso y aquí está el código de trabajo final.
static string GetColumnName(int index)
{
const int alphabetsCount = 26;
if (index > alphabetsCount)
{
int mod = index % alphabetsCount;
int columnIndex = index/alphabetsCount;
// if mod is 0 (clearly divisible) we reached end of one combination. Something like AZ
if (mod == 0)
{
// reducing column index as index/alphabetsCount will give the next value and we will miss one column.
columnIndex -= 1;
// passing 0 to the function will return character '@' which is invalid
// mod should be the alphabets count. So it takes the last char in the alphabet.
mod = alphabetsCount;
}
return GetColumnName(columnIndex) + GetColumnName(mod);
}
else
{
int code = (index - 1) + (int)'A';
return char.ConvertFromUtf32(code);
}
}
Genial.Mi matemática está oxidada. Entonces no pude entender el funcionamiento del módulo. Gracias por el código –