Thomas Zilliox
Intégrateur CSS Freelance à Lyon

Convertir des nombres en lettres en JavaScript

Pour trouver une lettre à partir de sa position dans l’alphabet, nous pouvons faire exactement l’inverse que pour la transformation de lettre en nombre. 🎉

/**
 * Returns the letter according to the alphabet position
 *
 * @param {number} position - The position in the alphabet
 * @return {string} letter - A letter
 */
function getLetterByAlphabeticPosition(position) {
  return (position + 9).toString(36);
}

Cette implémentation fonctionne très bien sur un jeu de données valide, mais produit des résultats inattendu sur les nombres inférieurs à 1 et supérieurs 26.

Exemples

getLetterByAlphabeticPosition(1); // ✔ "a"
getLetterByAlphabeticPosition(26); // ✔ "z"
getLetterByAlphabeticPosition(27); // ⨯ 10
getLetterByAlphabeticPosition(0); // ⨯ 9
getLetterByAlphabeticPosition(-25); // ⨯ -g
getLetterByAlphabeticPosition(-26); // ⨯ -h

Plus de contrôle

const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");

/**
 * Returns the letter according to the alphabet position
 *
 * @param {number} position - The position in the alphabet
 * @return {string} letter - A letter
 */
function getLetterByAlphabeticPosition(position) {
  if (position < 1 || position > alphabet.length) {
    return false;
  }

  return alphabet[position - 1];
}

Exemples

getLetterByAlphabeticPosition(1); // ✔ "A"
getLetterByAlphabeticPosition(26); // ✔ "Z"
getLetterByAlphabeticPosition(27); // ✔ false
getLetterByAlphabeticPosition(0); // ✔ false
getLetterByAlphabeticPosition(-25); // ✔ false
getLetterByAlphabeticPosition(-26); // ✔ false

Modulo

Le problème restant sera de gérer des débordements cycliques, si 26 donne Z alors il faudrait que 27 donne A ! Avec un code Vigenere, ou un code Cesar, on boucle si on arrive au bout de l’alphabet.

Pour cela, nous allons utiliser l’opération mathématique modulo. Nous allons utiliser une implémentation améliorée et étudiée dans des articles précédents pour  :

Voici ma solution pour convertir un nombre en lettre tout en gérant des débordements cycliques.

/**
 * Returns the letter according to the alphabet position
 * handles cyclic overflows, Ex: 1->A, 26->Z, 27->A, 0->Z
 *
 * @param {number} position - The position in the alphabet
 * @return {string} letter - A letter
 */
function numberToLetter(position) {
  return getLetterByAlphabeticPosition(
    moduloClamp(position, 1, alphabet.length)
  );
}
Voir les dépendances
const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");

// See https://tzi.fr/js/convertir-nombres-en-lettres/
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;
}

Exemples

numberToLetter(1); // ✔ "A"
numberToLetter(2); // ✔ "B"
numberToLetter(26); // ✔ "Z"
numberToLetter(27); // ✔ "A"
numberToLetter(0); // ✔ "Z"
numberToLetter(-25); // ✔ "A"
numberToLetter(-26); // ✔ "Z"

Essayez


console.log(numberToLetter(1));
console.log(numberToLetter(0));
console.log(numberToLetter(-1));

Amusez-vous bien, Thomas.

That's my face!

Thomas ZILLIOX

L'homme qui murmurait à l'oreille des chevrons.

Je développe, j'intègre, je forme ou je conseille sur les CSS. Besoin d'améliorer la maintenabilité ou les performances de vos projets ?