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.
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.
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);
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 :)
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.
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
}
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);
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).
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"
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.