2012-03-28 417 views
14

在我的網格中,列標題被命名爲A,B,C...,AA,AB,AC,...等,就像excel電子表格一樣。我如何可以轉換字符串數字,如:A => 1, B => 2, AA => 27將excel列字母(例如AA)轉換爲數字(例如25)

+1

一個小幅盤整... AA應在27 – 2012-03-28 10:25:05

+2

你就不能使用位置您希望將其轉換爲其數值的列?如果AA處於第25位,那就是你的答案...... – Yaniro 2012-03-28 10:25:49

+1

不,沒有「沒有代碼片段」。如果你寫了一本,告訴我們你到目前爲止有什麼。順便說一句,爲什麼'AA'25而不是27? – 2012-03-28 10:26:12

回答

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

謝謝你的男人...非常感謝你.. – 2012-03-28 11:09:06

+0

@JaisonJustus不客氣;) – Yoshi 2012-03-28 11:12:49

2

我只是寫了一個垃圾場˚[email protected]#$片斷......需要優化.. :)

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 2015-03-10 02:46:26

+0

@馬克是它只是一個快速的解決方法。如果可能的話,你可以優化代碼併發布更好的答案。在此先感謝 – 2015-03-17 13:12:52

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'在你的功能中給出'53'而不是'28'。 – Yoshi 2012-03-28 11:14:22

+0

你是對的。我修復了代碼。應該是:'string.substr(((i + 1)* -1),1)' – iMoses 2012-03-28 11:24:55

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] 
相關問題