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.


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.


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

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 :)


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.


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
}

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.


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

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).


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"


-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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.