Konvertieren Sie eine Ganzzahl in ein Zeichenäquivalent, wobei 0 => a, 1 => b usw.


173

Ich möchte eine Ganzzahl basierend auf dem Alphabet in ein Zeichenäquivalent umwandeln. Beispielsweise:

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

usw. Ich könnte ein Array erstellen und es einfach nachschlagen, wenn ich es brauche, aber ich frage mich, ob es eine eingebaute Funktion gibt, die dies für mich erledigt. Alle Beispiele, die ich über Google gefunden habe, arbeiten mit ASCII-Werten und nicht mit der Position eines Zeichens im Alphabet.


2
Die Kleinbuchstaben sind in ASCII alphabetisch geordnet.
Anon.

13
Sogar die Ziffern ;-)
mbq

Antworten:


324

Angenommen, Sie möchten Kleinbuchstaben:

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

97 ist der ASCII-Code für Kleinbuchstaben 'a'. Wenn Sie Großbuchstaben möchten, ersetzen Sie 97 durch 65 (Großbuchstaben 'A'). Beachten Sie, dass n > 25Sie in diesem Fall den Buchstabenbereich verlassen.


82

Wird tragbarer sein, wenn es auf andere Alphabete ausgedehnt wird:

char='abcdefghijklmnopqrstuvwxyz'[code]

oder um kompatibler zu sein (mit unserem geliebten IE):

char='abcdefghijklmnopqrstuvwxyz'.charAt(code);

5
Viel eleganter als String.fromCharCodemeiner Meinung nach, wie Sie sagten, erstreckt es sich sehr leicht.
Sasha Chedygov

8
Und wenn Sie keine Erweiterung benötigen, sind Sie möglicherweise fehleranfälliger? abcede
Nelson Rothermel

5
FYI JScript (IE) unterstützt den Indexoperator []für Zeichenfolgen nicht.
Crescent Fresh

4
@Crescent, der []Eigenschaftenzugriff für Zeichenfolgen, wird im IE ab IE8 unterstützt (IE8 im IE7-Kompatibilitätsmodus funktioniert ebenfalls nicht) und String.prototype.chatAtwird aus Gründen der []Browserkompatibilität anstelle von IE8 bevorzugt . ZB'foo'.charAt(0) == 'f'
CMS

2
@Crescent, ich habe vergessen zu erwähnen, dass der []Eigenschaftszugriff auf Zeichenfolgen in ECMAScript 5 standardisiert ist (siehe [[GetOwnProperty]] (P) ).
CMS

29

Wenn es Ihnen nichts ausmacht, Zeichenfolgen mit mehreren Zeichen zurückzugewinnen, können Sie beliebige positive Indizes unterstützen:

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

(Nicht gründlich auf Präzisionsfehler getestet :)


1
Rekursive Funktion, sehr schön!
John Virgolino

@mikemaccana, warum diese Bearbeitung? Ich denke, es macht es schwieriger zu lesen. Jetzt muss ich horizontal scrollen, um den Code zu lesen.
z0r

@ z0r Leute, die den Code verwenden, müssen den Zeilenumbruch also nicht korrigieren. Es gibt keinen Grund, Zeilen willkürlich zu unterbrechen. Die Redakteure werden die Zeichengröße ihres Fensters umbrechen.
Mikemaccana

Das funktioniert super, gibt es eine Variante, um das Gegenteil zu tun?
Ethannn

function idOf(i) { return (i >= 26 ? idOf(Math.floor(i / 26) -1 ) : '') + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[i % 26]; }
Gute

19

Eine einfache Antwort wäre (26 Zeichen):

String.fromCharCode(97+n);

Wenn Platz wertvoll ist, können Sie Folgendes tun (20 Zeichen):

(10+n).toString(36);

Überlegen Sie, was Sie mit all diesen zusätzlichen Bytes machen könnten!

So konvertieren Sie die Zahl in Basis 36, sodass Sie die folgenden Zeichen haben:

0123456789abcdefghijklmnopqrstuvwxyz
^         ^
n        n+10

Durch Versetzen um 10 beginnen die Zeichen bei astatt 0.

Ich bin mir nicht ganz sicher, wie schnell die beiden verschiedenen Beispiele auf der Clientseite ausgeführt werden.


2
Ich habe Ihre Basis 36 Kreativität genossen
Josh

6

String.fromCharCode (Code1, Code2, ..., CodeN) von Javascript akzeptiert unendlich viele Argumente und gibt eine Buchstabenfolge zurück, deren entsprechende ASCII-Werte Code1, Code2, ... CodeN sind. Da 97 in ASCII 'a' ist, können wir Ihre Indizierung anpassen, indem wir 97 zu Ihrem Index hinzufügen.

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

4
Um pedantisch zu sein, braucht es eine variable Anzahl von Argumenten, keine unendliche Anzahl.
Wchargin

4

Ich mag nicht alle Lösungen, die magische Zahlen wie 97oder verwenden 36.

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

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

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

Dies setzt Großbuchstaben voraus und beginnt 'A' bei 0.


3

Verwenden Sie String.fromCharCode. Dies gibt eine Zeichenfolge aus einem Unicode-Wert zurück, die den ersten 128 Zeichen von ASCII entspricht.

var a = String.fromCharCode(97);

3

Los geht's: (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 );
}

Eingabe: 0-51, oder es wird false zurückgegeben (Bereichsfehler);

ODER:

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

Gibt im Falle eines Bereichsfehlers undefiniert zurück. HINWEIS: Das Array wird nur einmal erstellt und ist aufgrund des Schließens für die neue Funktion codeToChar verfügbar. Ich denke, es ist noch schneller als die erste Methode (im Grunde ist es nur eine Suche).


Das funktioniert mit ASCII, ich muss mit der Position des Zeichens im Alphabet arbeiten.
VIVA LA NWO

@ VIVA - Ich denke, Sie hätten das klären können? @ Galambalaza - Ich denke, Sie wollen 65 nicht 64
James Westgate

Ich habe nur gezeigt, wie einfach es ist. er hätte das klären können. aber los geht's. siehe das Update
gblazex

1

Das einzige Problem mit der großartigen Lösung von @ mikemaccana ist, dass der binäre >> Operator verwendet wird, der in Bezug auf die Leistung teuer ist. Ich schlage diese Änderung seiner großartigen Arbeit als leichte Verbesserung vor, die Ihre Kollegen vielleicht leichter lesen können.

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

Oder als Einzeiler

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

Beispiel:

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


-3

Angenommen, Sie möchten Großbuchstaben:

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

Beispiel:

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

numberToLetter ('5') ist "F"

Funktion von Zahl zu Buchstabe

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.