J’utilise toujours la même technique pour transformer des lettres en nombres selon leur position dans l’alphabet :
/**
* Returns the letter position in the alphabet
*
* @param {string} letter - A letter to transform
* @return {number} number - The position in the alphabet
*/
function letterToNumber(letter) {
return parseInt(letter, 36) - 9;
}
Cette technique a deux intérêts par rapport à letter.charCodeAt(0) - 96
:
Source : Stack Overflow
letterToNumber("a"); // ✔ 1
letterToNumber("z"); // ✔ 26
letterToNumber("A"); // ✔ 1
letterToNumber("Z"); // ✔ 26
letterToNumber(" "); // ⨯ NaN
letterToNumber("!"); // ⨯ NaN
letterToNumber("0"); // ⨯ -9
Le gros défaut de cette implémentation va être le manque de contrôle sur les cas d’erreur. Si le caractère
n’est pas connu, vous obtiendrez NaN
. Pour les chiffres, c’est encore plus compliqué, la fonction
précédente renverra une valeur entre -9 et 0.
Il faut alors que l’on confirme la validité d’un caractère avant de le transformer en chiffre. C’est aussi l’occasion de pouvoir utiliser cette fonction sur des alphabets personnalisés, ce qui nous permettrait par exemple de décaler les chiffres également.
const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
/**
* Returns if the letter is in the alphabet
*
* @param {string} letter - A letter to transform
* @return {boolean} true if the letter is present in the alphabet
*/
function isLetterInAlphabet(letter) {
return alphabet.includes(letter.toUpperCase());
}
/**
* Returns the letter position in the alphabet
*
* @param {string} letter - A letter to transform
* @return {number} number - The position in the alphabet
*/
function letterToNumber(letter) {
if (!isLetterInAlphabet(letter)) {
return false;
}
return alphabet.indexOf(letter.toUpperCase()) + 1;
}
letterToNumber("a"); // ✔ 1
letterToNumber("z"); // ✔ 26
letterToNumber("A"); // ✔ 1
letterToNumber("Z"); // ✔ 26
letterToNumber(" "); // ✔ false
letterToNumber("!"); // ✔ false
letterToNumber("0"); // ✔ false
console.log(letterToNumber("a"));
console.log(letterToNumber("!"));