2009-12-23 14 views

Respuesta

22

Tener un vistazo a estos

/// <summary> 
/// 1 -> A<br/> 
/// 2 -> B<br/> 
/// 3 -> C<br/> 
/// ... 
/// </summary> 
/// <param name="column"></param> 
/// <returns></returns> 
public static string ExcelColumnFromNumber(int column) 
{ 
    string columnString = ""; 
    decimal columnNumber = column; 
    while (columnNumber > 0) 
    { 
     decimal currentLetterNumber = (columnNumber - 1) % 26; 
     char currentLetter = (char)(currentLetterNumber + 65); 
     columnString = currentLetter + columnString; 
     columnNumber = (columnNumber - (currentLetterNumber + 1))/26; 
    } 
    return columnString; 
} 

/// <summary> 
/// A -> 1<br/> 
/// B -> 2<br/> 
/// C -> 3<br/> 
/// ... 
/// </summary> 
/// <param name="column"></param> 
/// <returns></returns> 
public static int NumberFromExcelColumn(string column) 
{ 
    int retVal = 0; 
    string col = column.ToUpper(); 
    for (int iChar = col.Length - 1; iChar >= 0; iChar--) 
    { 
     char colPiece = col[iChar]; 
     int colNum = colPiece - 64; 
     retVal = retVal + colNum * (int)Math.Pow(26, col.Length - (iChar + 1)); 
    } 
    return retVal; 
} 
+0

funciona bien, gracias – Thunder

+0

¿Hay alguna razón por la que está utilizando decimal como tipo para ColumnNumber y currentLetterNumber? – Matthias

+0

No, esta es solo la forma en que originalmente lo implementé. Puedes cambiarlo a Ints. Probado rápido y parece estar bien. –

32

He aquí una expresión LINQ simple:

static int TextToNumber(this string text) { 
    return text 
     .Select(c => c - 'A' + 1) 
     .Aggregate((sum, next) => sum*26 + next); 
} 

Esta prueba

Console.WriteLine(" A -> " + "A".TextToNumber()); 
Console.WriteLine(" B -> " + "B".TextToNumber()); 
Console.WriteLine(" Z -> " + "Z".TextToNumber()); 
Console.WriteLine("AA -> " + "AA".TextToNumber()); 
Console.WriteLine("AB -> " + "AB".TextToNumber()); 

producirá esta salida:

A -> 1 
B -> 2 
Z -> 26 
AA -> 27 
AB -> 28 

Actualización: Aquí está el mismo código, pero que apuntan a .NET 2.0:

static int TextToNumber(string text) { 
    int sum = 0; 
    foreach (char c in text) { 
     sum = sum*26 + c - 'A' + 1; 
    } 
    return sum; 
} 
+0

+1 solución muy clara – Kamal

+2

+1 para usar un doblez. Ni siquiera necesita convertir la cadena a una matriz de caracteres, ya que una cadena se comporta como un IEnumerable ya. P.ej. 's.Seleccione (c => c - 'A' + 1) .Agregado ((suma, siguiente) => suma * 26 + siguiente)' – cfern

+0

Thx cfern. Olvidé que la cuerda implementa IEnumerable . He actualizado mi respuesta –

2

Este es un código JavaScript, si lo prefiere que se haga en el lado del cliente

<script type="text/javascript" lang="javascript"> 
function Alphabet2Numeric(mystr) { 
    mystr = mystr.toUpperCase(); //Hence the ASCII code 64 down there 
    var sum = 0; 
    for (var i = 0; i < mystr.length; i++) { 
     sum = sum * 26 + mystr.charCodeAt(i) - 64; //returns 1 for 'a' and 2 for 'b' so on and so forth. 
    } 
    return sum; 
} 
</script> 
0

mismo problema, idioma diferente: PHP.

function charToInt($char) 
{ 
    $array = array_flip(range(a, z)); 
    return $array[$char] + 1; 
} 

echo charToInt('c'); 

outputs: 3 
Cuestiones relacionadas