Tamsayıyı karakter eşdeğerine dönüştürün; burada 0 => a, 1 => b vb.


173

Alfabeye dayalı bir tamsayıyı karakter eşdeğerine dönüştürmek istiyorum. Örneğin:

0 => a
1 => b
2 => c
3 => d

vb. Ben bir dizi inşa edebilir ve sadece ihtiyacım olduğunda bak ama benim için bunu yapmak için yerleşik bir fonksiyon olup olmadığını merak ediyorum. Google aracılığıyla bulduğum tüm örnekler, bir karakterin alfabedeki konumu ile değil ASCII değerleri ile çalışıyor.


2
Küçük harfler ASCII'de alfabetik olarak sıralanmıştır.
Anon.

13
Hatta rakamlar ;-)
mbq

Yanıtlar:


324

Küçük harfler istediğinizi varsayarsak:

var chr = String.fromCharCode(97 + n); // where n is 0, 1, 2 ...

97, küçük harf 'a' için ASCII kodudur. Büyük harfler istiyorsanız 97'yi 65 ile değiştirin (büyük harf 'A'). Eğer n > 25, harf aralığının dışına çıkacağınızı unutmayın .


82

Diğer harflere uzanma durumunda daha taşınabilir olacaktır:

char='abcdefghijklmnopqrstuvwxyz'[code]

veya daha uyumlu olmak için (sevgili IE'mizle):

char='abcdefghijklmnopqrstuvwxyz'.charAt(code);

5
String.fromCharCodeSöylediğim gibi çok daha zarif , çok kolay uzanıyor.
Sasha Chedygov

8
Ve genişletmeye ihtiyacınız olmadığında, belki de hatalara daha yatkın mı? abcede
Nelson Rothermel

5
FYI JScript (IE) dizin operatörünü desteklemiyor [] dizelerde .
Crescent Fresh

4
@Crescent, []IE8 kadar IE'de dizelerde özellik erişimcisi desteklenir (IE7 uyumlu modda IE8 de çalışmaz), tarayıcı uyumluluğu String.prototype.chatAtyerine tercih edilir []. Ör.'foo'.charAt(0) == 'f'
CMS

2
@Crescent, []dizelerdeki özellik erişimcisinin ECMAScript 5'te standartlaştırıldığını belirtmeyi unuttu (bkz. [[GetOwnProperty]] (P) ).
CMS

29

Çok karakterli dizeleri geri almanın sakıncası yoksa, rastgele pozitif indeksleri destekleyebilirsiniz:

function idOf(i) {
    return (i >= 26 ? idOf((i / 26 >> 0) - 1) : '') +  'abcdefghijklmnopqrstuvwxyz'[i % 26 >> 0];
}

idOf(0) // a
idOf(1) // b
idOf(25) // z
idOf(26) // aa
idOf(27) // ab
idOf(701) // zz
idOf(702) // aaa
idOf(703) // aab

(Hassas hatalar için kapsamlı bir şekilde test edilmemiştir :)


1
Özyinelemeli fonksiyon, çok güzel!
John Virgolino

@mikemaccana, neden bu düzenleme? Bence okumayı zorlaştırıyor. Şimdi kodu okumak için yatay olarak kaydırmam gerekiyor.
z0r

@ z0r Bu yüzden kodu kullanan kişilerin yeni satırı düzeltmeleri gerekmez. Çizgileri keyfi olarak kesmenin bir nedeni yoktur, editörler pencerelerinin karakter boyutuna sarılır.
mikemaccana

Bu harika çalışıyor, tam tersini yapmak için bir varyant var mı?
Ethannn

Güzel fikir, ama bu değişene kadar işe yaramadı:function idOf(i) { return (i >= 26 ? idOf(Math.floor(i / 26) -1 ) : '') + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[i % 26]; }
PatrickvL

19

Basit bir cevap olurdu (26 karakter):

String.fromCharCode(97+n);

Boşluk değerli ise aşağıdakileri yapabilirsiniz (20 karakter):

(10+n).toString(36);

Tüm bu ekstra baytlarla neler yapabileceğinizi düşünün!

Bu nasıl çalışır, sayıyı temel 36'ya dönüştürürsünüz, bu nedenle aşağıdaki karakterlere sahipsiniz:

0123456789abcdefghijklmnopqrstuvwxyz
^         ^
n        n+10

10 ile mahsup edilerek karakterler başlayacak ayerine0 .

İstemci tarafındaki iki farklı örneği ne kadar hızlı çalıştıracağından tam olarak emin değilim.


2
Temel 36 yaratıcılığınızı beğendim
Josh

6

Javascript'in String.fromCharCode'u (kod1, kod2, ..., kodN) sonsuz sayıda bağımsız değişken alır ve karşılık gelen ASCII değerleri kod1, kod2, ... kodN olan bir harf dizesi döndürür. ASCII'de 97 'a' olduğundan, dizininize 97 ekleyerek dizine ekleme işleminizi ayarlayabiliriz.

function indexToChar(i) {
  return String.fromCharCode(i+97); //97 in ASCII is 'a', so i=0 returns 'a', 
                                    // i=1 returns 'b', etc
}

4
Bilgiçlikçi olmak, sonsuz sayıda değil, değişken sayıda argüman gerektirir .
wchargin

4

97Veya gibi sihirli sayılar kullanan tüm çözümleri sevmiyorum 36.

const A = 'A'.charCodeAt(0);

let numberToCharacter = number => String.fromCharCode(A + number);

let characterToNumber = character => character.charCodeAt(0) - A;

bu büyük harfleri alır ve 0'da 'A'yı başlatır.


3

Kullanın String.fromCharCode. Bu, Unicode değerinden ASCII'nin ilk 128 karakteriyle eşleşen bir dize döndürür.

var a = String.fromCharCode(97);

3

İşte böyle: (a-zA-Z)

function codeToChar( number ) {
  if ( number >= 0 && number <= 25 ) // a-z
    number = number + 97;
  else if ( number >= 26 && number <= 51 ) // A-Z
    number = number + (65-26);
  else
    return false; // range error
  return String.fromCharCode( number );
}

giriş: 0-51, yoksa yanlış döndürür (aralık hatası);

VEYA:

var codeToChar = function() {
  var abc = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
  return function( code ) {
    return abc[code];
  };
})();

aralık hatası durumunda tanımsız olarak döner. Not: dizi yalnızca bir kez oluşturulur ve kapatma nedeniyle yeni codeToChar işlevi için kullanılabilir. Sanırım ilk yöntemden bile daha hızlı (sadece temelde bir arama).


ASCII ile çalışır, alfabedeki karakterin konumu ile çalışmam gerekir.
VIVA LA NWO

@VIVA - Sanırım bunu çözebilirdin? @Galambalaza - Sanırım 65 değil 64 değil
James Westgate

sadece ne kadar basit olduğunu gösterdim. bunu çözebilirdi. ama işte gidiyorsunuz. güncellemeye bakın
gblazex

1

@ Mikemaccana'nın harika çözümü ile ilgili tek sorun, pahalı, performans açısından ikili >> operatörünü kullanmasıdır. Bu modifikasyonunu meslektaşlarınızın belki de daha kolay okuyabileceği hafif bir gelişme olarak öneriyorum.

const getColumnName = (i) => {
     const previousLetters = (i >= 26 ? getColumnName(Math.floor(i / 26) -1 ) : '');
     const lastLetter = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[i % 26]; 
     return previousLetters + lastLetter;
}

Veya tek astar olarak

const getColumnName = i => (i >= 26 ? getColumnName(Math.floor(i / 26) -1 ) : '') + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[i % 26];

Misal:

getColumnName(0); // "A"
getColumnName(1); // "B"
getColumnName(25); // "Z"
getColumnName(26); // "AA"
getColumnName(27); // "AB"
getColumnName(80085) // "DNLF"


-3

Büyük harf istediğinizi varsayarsak:

function numberToLetter(num){
        var alf={
            '0': 'A', '1': 'B', '2': 'C', '3': 'D', '4': 'E', '5': 'F', '6': 'G'
        };
        if(num.length== 1) return alf[num] || ' ';
        return num.split('').map(numberToLetter);
    }

Misal:

numberToLetter ( '023') olan [ "A", "C", "D"]

numberToLetter ( '5') olan , "F"

sayıdan harfe işlevi

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.