2012-03-28 9 views
14

Nella mia griglia le intestazioni delle colonne sono denominate A,B,C...,AA,AB,AC,... ecc. Come un foglio di calcolo Excel. Come posso convertire la stringa in numero come: A => 1, B => 2, AA => 27Converti alfabeto colonna excel (ad esempio AA) in numero (ad es. 25)

+1

Una piccola correzione ... AA dovrebbe essere 27 –

+2

non puoi semplicemente usare la posizione della colonna che desideri convertire come valore numerico? se AA è in 25a posizione, questa è la tua risposta ... – Yaniro

+1

No, non c'è "snippet di codice per quello". Se sei bloccato a scriverne uno, mostraci quello che hai finora. A proposito, perché "AA" 25 e non 27? –

risposta

31

Prova:

var foo = function(val) { 
    var base = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', i, j, result = 0; 

    for (i = 0, j = val.length - 1; i < val.length; i += 1, j -= 1) { 
    result += Math.pow(base.length, j) * (base.indexOf(val[i]) + 1); 
    } 

    return result; 
}; 

console.log(['A', 'AA', 'AB', 'ZZ'].map(foo)); // [1, 27, 28, 702] 
+1

grazie amico ... grazie mille .. –

+0

@JaisonJustus sei il benvenuto;) – Yoshi

2

ho appena scritto un deposito di rottami f @ # $ snippet ... bisogno di essere ottimizzato .. :)

charToNum = function(alpha) { 
     var index = 0 
     for(var i = 0, j = 1; i < j; i++, j++) { 
      if(alpha == numToChar(i)) { 
       index = i; 
       j = i; 
      } 
     } 
     console.log(index); 
    } 

numToChar = function(number) { 
     var numeric = (number - 1) % 26; 
     var letter = chr(65 + numeric); 
     var number2 = parseInt((number - 1)/26); 
     if (number2 > 0) { 
      return numToChar(number2) + letter; 
     } else { 
      return letter; 
     } 
    } 
chr = function (codePt) { 
     if (codePt > 0xFFFF) { 
      codePt -= 0x10000; 
      return String.fromCharCode(0xD800 + (codePt >> 10), 0xDC00 + (codePt & 0x3FF)); 
     } 
     return String.fromCharCode(codePt); 
    } 

charToNum ('A') => restituisce 1 e charToNum ('AA') => restituisce 27;

+1

numToChar funziona bene, ma sembra che la tua funzione charToNum sia incompleta (e inefficiente). – mpen

+0

@ Mark sì è solo una soluzione rapida. se possibile, puoi ottimizzare il codice e pubblicare una risposta migliore. Grazie in anticipo –

6

Ecco un rapido esempio del codice è necessario implementare. Funzionerà con qualsiasi numero di lettere specificato.

function letterToNumbers(string) { 
    string = string.toUpperCase(); 
    var letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', sum = 0, i; 
    for (i = 0; i < string.length; i++) { 
     sum += Math.pow(letters.length, i) * (letters.indexOf(string.substr(((i + 1) * -1), 1)) + 1); 
    } 
    return sum; 
} 
+0

Hai un piccolo errore nel tuo esponente. Per esempio. 'AB' dà' 53' invece di '28' con la tua funzione. – Yoshi

+0

Sei corretto. Ho risolto il codice. Dovrebbe essere stato: 'string.substr (((i + 1) * -1), 1)' – iMoses

0
Public Function ColLet2Num(Letras As String) 
'RALONSO MAYO 2017 
'A-> 1 
'OQ ->407 
'XFD->16384 
Dim UnChar As String 
Dim NAsc As Long 
Dim F As Long 
Dim Acum As Long 
Dim Indice As Long 
Letras = UCase(Letras) 
Acum = 0 
Indice = 0 
For F = Len(Letras) - 1 To 0 Step -1 

    UnChar = Mid(Letras, F + 1, 1) 
    NAsc = Asc(UnChar) - 64 
    Acum = Acum + (NAsc * (26^Indice)) 
    Indice = Indice + 1 
Next 
If Acum > 16384 Then 
    MsgBox "La celda máxima es la XFD->16384", vbCritical 
End If 
ColLet2Num = Acum 
End Function 
2

soluzione 1: migliore compatibilità prestazioni e il browser

// convert A to 1, Z to 26, AA to 27 
function lettersToNumber(letters){ 
    var chrs = ' ABCDEFGHIJKLMNOPQRSTUVWXYZ', mode = chrs.length - 1, number = 0; 
    for(var p = 0; p < letters.length; p++){ 
     number = number * mode + chrs.indexOf(letters[p]); 
    } 
    return number; 
} 

soluzione 2: codice corto (funzione freccia ES6)

// convert A to 1, Z to 26, AA to 27 
function lettersToNumber(letters){ 
    return letters.split('').reduce((r, a) => r * 26 + parseInt(a, 36) - 9, 0); 
} 

prova:

['A', 'Z', 'AA', 'AB', 'ZZ','BKTXHSOGHKKE'].map(lettersToNumber); 
// [1, 26, 27, 28, 702, 9007199254740991] 

lettersToNumber('AAA'); //703 
0

Ho riscritto Yoshi's answer in una forma più dettagliata che spiega meglio come funziona ed è più facile da porta per altre lingue:

var foo = function(val) { 
    var base = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; 
    var baseNumber = base.length; 

    var runningTotal = 0; 
    var characterIndex = 0; 
    var indexExponent = val.length - 1; 

    while(characterIndex < val.length){ 
     var digit = val[characterIndex]; 
     var digitValue = base.indexOf(digit) + 1; 
     runningTotal += Math.pow(baseNumber, indexExponent) * digitValue; 

     characterIndex += 1 
     indexExponent -= 1 
    } 

    return runningTotal; 
}; 

console.log(['A', 'AA', 'AB', 'ZZ'].map(foo)); // [1, 27, 28, 702] 
Problemi correlati