Nous avons vu comment convertir des lettres en nombres et comment convertir des nombres en lettres en JavaScript dans des articles précédent. Ici, nous allons compiler les deux techniques pour permettre de décaler une lettre de
n
positions dans l’alphabet.
/**
* Returns the shifted letter of an offset in the alphabet
*
* @param {string} letter
* @param {number} offset
* @return {number} The shifted letter
*/
function shiftLetter(letter, offset) {
if (!isLetterInAlphabet(letter)) {
return letter;
}
return numberToLetter(letterToNumber(letter) + offset);
}
const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
// See https://tzi.fr/js/convertir-lettres-en-nombres/
function letterToNumber(letter) {
if (!isLetterInAlphabet(letter)) {
return false;
}
return alphabet.indexOf(letter.toUpperCase()) + 1;
}
function isLetterInAlphabet(letter) {
return alphabet.includes(letter.toUpperCase());
}
// See https://tzi.fr/js/convertir-nombres-en-lettres/
function numberToLetter(position) {
return getLetterByAlphabeticPosition(
moduloClamp(position, 1, alphabet.length)
);
}
function getLetterByAlphabeticPosition(position) {
if (position < 1 || position > alphabet.length) {
return false;
}
return alphabet[position - 1];
}
// See https://tzi.fr/js/modulos-min-max
function moduloClamp(number, min, max) {
return positiveModulo(number - min, max + 1 - min) + min;
}
// See https://tzi.fr/js/modulos-positifs
function positiveModulo(number, divisor) {
return ((number % divisor) + divisor) % divisor;
}
shiftLetter("a", 0); // "A"
shiftLetter("a", 1); // "B"
shiftLetter("a", 25); // "Z"
shiftLetter("a", 26); // "A"
shiftLetter("a", -52); // "A"
shiftLetter("A", 1); // "B"
console.log(shiftLetter('A', 0));
console.log(shiftLetter('A', 1));
console.log(shiftLetter('A', -1));