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.

VIVA LA NWO
quelle
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.

Daniel Vandersluis
quelle
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);
mbq
quelle
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 :)

z0r
quelle
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.

Dan
quelle
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
}
Hundert Watt
quelle
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.

junvar
quelle
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);
James Westgate
quelle
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).

gblazex
quelle
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"
Pandem1c
quelle
0

Versuchen

(n+10).toString(36)

Kamil Kiełczewski
quelle
-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

Rafael Corrêa Gomes
quelle