He estado trabajando con esto durante un tiempo, y encontré que esto funcione realmente bueno para las columnas que van más allá de AZ, o incluso más allá de AA-ZZ ... Se logra romperse cada carácter de la cadena y recursivamente llamando a derivar el valor DEC del carácter ASCII (menos 64), luego multiplicándolo por 26^n. Se utilizó un valor de retorno de largo para superar una limitación potencial cuando n> 4.
public long columnNumber(String columnName)
{
char[] chars = columnName.ToUpper().ToCharArray();
return (long)(Math.Pow(26, chars.Count() - 1)) *
(System.Convert.ToInt32(chars[0]) - 64) +
((chars.Count() > 2) ? columnNumber(columnName.Substring(1, columnName.Length - 1)) :
((chars.Count() == 2) ? (System.Convert.ToInt32(chars[chars.Count() - 1]) - 64) : 0));
}
Además, si desea obtener la inversa (es decir pase en el ColumnNumber y obtener el columnName, aquí hay un código que trabaja para eso.
public String columnName(long columnNumber)
{
StringBuilder retVal = new StringBuilder();
int x = 0;
for (int n = (int)(Math.Log(25*(columnNumber + 1))/Math.Log(26)) - 1; n >= 0; n--)
{
x = (int)((Math.Pow(26,(n + 1)) - 1)/25 - 1);
if (columnNumber > x)
retVal.Append(System.Convert.ToChar((int)(((columnNumber - x - 1)/Math.Pow(26, n)) % 26 + 65)));
}
return retVal.ToString();
}
nice! ! –
realmente bueno, hombre. Lo estaba haciendo, pero el método era mucho más grande que esta simple solución. –
Gracias. Y sí, creo que esto parece bastante simple, aunque no dude en sugerir cualquier optimización ... – Noldorin