Convertit un entier en son équivalent caractère, où 0 => a, 1 => b, etc.

173

Je veux convertir un entier en son équivalent de caractère basé sur l'alphabet. Par exemple:

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

etc. Je pourrais construire un tableau et le rechercher quand j'en ai besoin, mais je me demande s'il existe une fonction intégrée pour le faire pour moi. Tous les exemples que j'ai trouvés via Google fonctionnent avec des valeurs ASCII et non avec la position d'un personnage dans l'alphabet.

VIVA LA NWO
la source
2
Les lettres minuscules sont classées par ordre alphabétique en ASCII.
Anon.
13
Even the digits ;-)
mbq

Réponses:

324

En supposant que vous vouliez des lettres minuscules:

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

97 est le code ASCII pour «a» minuscule. Si vous voulez des lettres majuscules, remplacez 97 par 65 (majuscule «A»). Notez que si n > 25, vous sortez de la plage des lettres.

Daniel Vandersluis
la source
82

Sera plus portable en cas d'extension à d'autres alphabets:

char='abcdefghijklmnopqrstuvwxyz'[code]

ou, pour être plus compatible (avec notre bien-aimé IE):

char='abcdefghijklmnopqrstuvwxyz'.charAt(code);
mbq
la source
5
Beaucoup plus élégant qu'à String.fromCharCodemon avis, comme vous l'avez dit, il s'étend très facilement.
Sasha Chedygov
8
Et quand vous n'avez pas besoin d'étendre, peut-être plus sujet aux erreurs? abcede
Nelson Rothermel
5
FYI JScript (IE) ne prend pas en charge l'opérateur d'index []sur les chaînes.
Crescent Fresh
4
@Crescent, l' []accesseur de propriété sur les chaînes est pris en charge sur IE à partir d'IE8 (IE8 en mode de compatibilité IE7 ne fonctionne pas non plus), String.prototype.chatAtest préférable []à la compatibilité du navigateur. Par exemple'foo'.charAt(0) == 'f'
CMS le
2
@Crescent, j'ai oublié de mentionner que l' []accesseur de propriété sur les chaînes est normalisé sur ECMAScript 5 (voir [[GetOwnProperty]] (P) ).
CMS
29

Si cela ne vous dérange pas de récupérer des chaînes à plusieurs caractères, vous pouvez prendre en charge des indices positifs arbitraires:

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

(Pas complètement testé pour les erreurs de précision :)

z0r
la source
1
Fonction récursive, très sympa!
John Virgolino
@mikemaccana, pourquoi cette modification? Je pense que cela rend la lecture plus difficile. Maintenant, je dois faire défiler horizontalement pour lire le code.
z0r
@ z0r Ainsi, les utilisateurs du code n'auront pas à corriger la nouvelle ligne. Il n'y a aucune raison de couper les lignes de manière arbitraire, les éditeurs s'enrouleront à la taille des caractères de leur fenêtre.
mikemaccana
Cela fonctionne très bien, existe-t-il une variante pour faire le contraire?
Ethannn
Bonne idée, mais cela n'a pas fonctionné jusqu'à ce qu'il se transforme en ceci:function idOf(i) { return (i >= 26 ? idOf(Math.floor(i / 26) -1 ) : '') + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[i % 26]; }
PatrickvL
19

Une réponse simple serait (26 caractères):

String.fromCharCode(97+n);

Si l'espace est précieux, vous pouvez faire ce qui suit (20 caractères):

(10+n).toString(36);

Pensez à ce que vous pourriez faire avec tous ces octets supplémentaires!

Comment cela fonctionne est-ce que vous convertissez le nombre en base 36, vous avez donc les caractères suivants:

0123456789abcdefghijklmnopqrstuvwxyz
^         ^
n        n+10

En décalant de 10, les caractères commencent à au alieu de 0.

Je ne suis pas tout à fait sûr de la vitesse à laquelle l'exécution des deux exemples différents côté client serait comparable.

Dan
la source
2
J'ai apprécié votre créativité de base 36
Josh
6

Le String.fromCharCode de Javascript (code1, code2, ..., codeN) prend un nombre infini d'arguments et renvoie une chaîne de lettres dont les valeurs ASCII correspondantes sont code1, code2, ... codeN. Puisque 97 est «a» en ASCII, nous pouvons ajuster votre indexation en ajoutant 97 à votre index.

function indexToChar(i) {
  return String.fromCharCode(i+97); //97 in ASCII is 'a', so i=0 returns 'a', 
                                    // i=1 returns 'b', etc
}
cent watts
la source
4
Eh bien, pour être pédant, il faut un nombre variable d'arguments, pas un nombre infini .
wchargin
4

Je n'aime pas toutes les solutions qui utilisent des nombres magiques comme 97ou 36.

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

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

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

cela suppose des lettres majuscules et commence «A» à 0.

junvar
la source
3

Utilisez String.fromCharCode. Cela renvoie une chaîne à partir d'une valeur Unicode, qui correspond aux 128 premiers caractères de l'ASCII.

var a = String.fromCharCode(97);
James Westgate
la source
3

Là vous allez: (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 );
}

entrée: 0-51, ou il retournera faux (erreur de plage);

OU:

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

renvoie undefined en cas d'erreur de plage. REMARQUE: le tableau ne sera créé qu'une seule fois et en raison de sa fermeture, il sera disponible pour la nouvelle fonction codeToChar. Je suppose que c'est encore plus rapide que la première méthode (c'est juste une recherche en gros).

gblazex
la source
Cela fonctionne avec ASCII, je dois travailler avec la position du caractère dans l'alphabet.
VIVA LA NWO
@VIVA - Je pense que tu aurais pu résoudre ça? @Galambalaza - Je pense que vous voulez 65 pas 64
James Westgate
je viens de montrer à quel point c'est simple. il aurait pu résoudre ce problème. mais là vous allez. voir la mise à jour
gblazex
1

Le seul problème avec la grande solution de @ mikemaccana est qu'il utilise l'opérateur binaire >> qui est coûteux, en termes de performances. Je propose cette modification à son excellent travail comme une légère amélioration que vos collègues pourront peut-être lire plus facilement.

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

Ou en one-liner

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

Exemple:

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

Essayer

(n+10).toString(36)

Kamil Kiełczewski
la source
-3

En supposant que vous vouliez des lettres majuscules:

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

Exemple:

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

numberToLetter ('5') est "F"

fonction nombre à lettre

Rafael Corrêa Gomes
la source