2012-03-28 19 views
14

Kılavuzumda sütun başlıkları, bir excel e-tablosu gibi A,B,C...,AA,AB,AC,... vb. Nasıl böyle dize numara dönüştürebilirsiniz: ben sadece @ # $ f önemsiz bahçesinde yazdı A => 1, B => 2, AA => 27Mükemmel sütun sütun alfabesini (ör. AA) sayıya (ör., 25) dönüştürün (ör., 25)

+1

Bir küçük düzeltme ... AA 27 –

+2

sadece pozisyon kullanılamaz olmalıdır sayısal değeri olarak dönüştürmek istediğiniz sütunun Eğer AA 25. pozisyondaysa, cevabınız budur ... – Yaniro

+1

Hayır, "bunun için kod snippet'i yok". Eğer birini yazdıysan, bize şu ana kadar ne yaptığını göster. Bu arada, neden "AA" 25 ve 27 değil? –

cevap

31

Dene:

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

Teşekkür ederim adam ... çok teşekkür ederim .. –

+0

@JaisonJustus Hoş Geldiniz;) – Yoshi

2

pasaj ... ihtiyacını optimize edilecek .. :)

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 değerini döndürür ve charToNum ('AA') => 27 değerini döndürür;

+1

numToChar güzel çalışıyor, ama charToNum işlevinin eksik (ve verimsiz) gibi görünüyor. – mpen

+0

@Mark evet sadece kısa bir çözümdür. Mümkünse kodu optimize edebilir ve daha iyi bir cevap gönderebilirsiniz. Teşekkürler –

6

Burada uygulamalıdır kod kısa bir örnek. Bu, belirli sayıda harfle çalışacaktır.

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

Üssünüzde küçük bir hata var. Örneğin. 'AB', işlevinizle' 28' yerine '53' verir. – Yoshi

+0

Siz haklısınız. Kodu tamir ettim. Olmalıydı: 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

çözelti 1: En iyi performans ve tarayıcı uyumluluğu

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

çözeltisi 2: kısa kodu (ES6 ok fonksiyonu)

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

testi:

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

lettersToNumber('AAA'); //703 
0

nasıl çalıştığını daha iyi açıklıyor ve diğer dillere limana daha kolay olan daha ayrıntılı biçimde Yoshi's answer yeniden yazdım:

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] 
İlgili konular