web-dev-qa-db-fra.com

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

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 regarder quand j'en aurais 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 les valeurs ASCII et non avec la position d'un caractère dans l'alphabet.

155
VIVA LA NWO

En supposant que vous vouliez des minuscules:

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

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

295
Daniel Vandersluis

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

char='abcdefghijklmnopqrstuvwxyz'[code]

ou, pour être plus compatible (avec notre cher IE):

char='abcdefghijklmnopqrstuvwxyz'.charAt(code);
79
mbq

Si vous voulez bien récupérer des chaînes multi-caractères, vous pouvez supporter des index 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 :)

24
z0r

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

String.fromCharCode(97+n);

Si l'espace est précieux, vous pouvez effectuer les opérations suivantes (20 caractères):

(10+n).toString(36);

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

Comment cela fonctionne-t-il si vous convertissez le nombre en base 36 afin que vous disposiez des caractères suivants:

0123456789abcdefghijklmnopqrstuvwxyz
^         ^
n        n+10

En décalant de 10, les caractères commencent par a au lieu de 0.

Je ne suis pas tout à fait certain de la rapidité d'exécution des deux exemples côté client.

16
Dan

Le code 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
}
6
hundredwatt

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

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

Et voilà: (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 );
}

input: 0-51 ou il retournera false (erreur de plage);

OU:

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

renvoie undefined en cas d'erreur d'intervalle . NOTE: le tableau ne sera créé qu'une seule fois et, en raison de sa fermeture, il sera disponible pour la nouvelle fonction codeToChar J'imagine que c'est encore plus rapide que la première méthode (il s'agit simplement d'une recherche).

2
gblazex

Le seul problème avec la solution géniale de @ mikemaccana est qu’il utilise l’opérateur binaire >>, ce 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 comme une ligne

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"
1
Pandem1c

Je n'aime pas toutes les solutions qui utilisent des nombres magiques comme 97 ou 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.

0
junvar