2012-03-28 8 views
14

グリッドでは、列ヘッダーの名前はA,B,C...,AA,AB,AC,...などとExcelスプレッドシートのようになります。どのように私はのような文字列を数値に変換することができます:私はちょうど@#$ Fジャンクヤードを書いたA => 1, B => 2, AA => 27Excelの列アルファベット(例:AA)を数値(例:25)に変換

+1

一つの小さな修正を... AAは27 –

+2

する必要がありますあなただけの位置を使用することはできませんその数値として変換する列のAAが25位にあれば、それはあなたの答えです... – Yaniro

+1

いいえ、そこには「コードスニペットはありません」とあります。あなたが書かれている場合は、あなたがこれまで持っているものを私たちに示してください。ちなみに、なぜ27ではなく「AA」25ですか? –

答えて

31

試してみてください。

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

ありがとうございました。ありがとうございます。 –

+0

@JaisonJustusようこそ;) – Yoshi

2

はスニペット...必要性を最適化するために.. :)

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' )=>は1を返し、charToNum( 'AA')=>は27を返します。

+1

numToCharはうまく動作しますが、charToNum関数が不完全で(非効率な)ように見えます。 – mpen

+0

@マークはい、そのすばやい回避策。可能であれば、コードを最適化してより良い回答を投稿することができます。ありがとうございます。 –

6

ここでは、実装する必要があるコードの簡単な例です。 これは任意の文字数で動作します。

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

指数に若干の誤差があります。例えば。 'AB'はあなたの関数で' 28'の代わりに '53'を返します。 – Yoshi

+0

あなたは正しいです。私はコードを修正した。 '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

溶液1:最高のパフォーマンスとブラウザ互換性

// 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; 
} 

溶液2:ショートコード(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); 
} 

試験:

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

lettersToNumber('AAA'); //703 
0

私はそれがどのように動作するかをよりよく説明し、他の言語への移植が容易になり、より詳細な形でYoshi's answer書き直し:

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] 
関連する問題