gtoubiana/acte

View on GitHub
src/js/public/functions/acte.nombreEnLettres.js

Summary

Maintainability
C
1 day
Test Coverage
/**
 * Pour convertir les nombres en toutes lettres.
 * @memberof acte
 * @access public
 * @author Gilles Toubiana
 * @since 0.0.17
 * @license MIT
 * @see {@link https://github.com/gtoubiana/acte|Projet sur GitHub}
 * @param {Number} n - le nombre en chiffres
 * @param {String} [r] - par défaut, la réforme de 1990 est appliquée.
 * Pour utiliser l'ancienne notation, il suffit d'ajouter un argument.
 * @return {String} le nombre en toutes lettres
 * @example
 * acte.nombreEnLettres(2371); // 'Deux-mille-trois-cent-soixante-et-onze'
 * acte.nombreEnLettres(1799,1); // 'Mille sept cent quatre-vingt-dix-neuf'
 */
acte.nombreEnLettres = (n, r) => {
  let mill;
  let centl;
  let dixl;
  let sepunit;
  let unitl;

  // UnitesEnLettres
  const u = unitesEnLettres;

  // DixainesEnLettres
  const v = dixainesEnLettres;

  // Saisie en valeur absolue
  const abs = Math.abs(n);
  const splus = (r) ? ' ' : '-';

  // Milliers
  const mil = parseInt(abs / 1000, 10);

  // Centaines
  const cent = parseInt((abs % 1000) / 100, 10);

  // Dixaines
  const dix = parseInt((abs % 100) / 10, 10);

  // Unités
  const unit = parseInt(abs % 10, 10);

  // Milliers
  if (mil === 1) {
    // Un seul millier
    mill = 'mille';
  } else if (mil > 1) {
    // Plusieurs milliers
    mill = `${u[mil]}${splus}mille`;
  } else {
    // Pas de milliers
    mill = '';
  }

  // Centaines
  const sepcen = (mil > 0) ? splus : '';

  if (cent === 1) {
    // Une seule centaine
    centl = `${sepcen}cent`;
  } else if (cent > 1 && dix === 0 && unit === 0) {
    // Plusieurs centaines
    centl = `${sepcen}${u[cent]}${splus}cents`;
  } else if (cent > 1) {
    // Plusieurs centaines suivies de dizaines
    centl = `${sepcen}${u[cent]}${splus}cent`;
  } else {
    // Pas de centaines
    centl = '';
  }

  // Dizaines et unités
  const sepdix = (mil + cent > 0) && (dix + unit > 0) ? splus : '';

  if (dix > 0) {
    dixl = v[dix];

    // Splus
    sepunit = '-';
  } else {
    dixl = '';
    sepunit = '';
  }

  // Unités
  unitl = (abs > 0) ? sepunit + u[unit] : 'zéro';

  // Multiples de 10
  if (((dix * 10) + unit) % 10 === 0) {
    unitl = '';
  }

  // Dix, soixante-dix, quatre-vingt-dix
  if ((dix === 1 || dix === 7 || dix === 9) && unit === 0) {
    dixl = (dix === 1) ? 'dix' : `${v[dix]}-dix`;
    unitl = (dix === 1) ? '' : u[unit];
  }

  // Onze+
  // soixante-et-onze+, quatre-vingt-onze+
  if ((dix === 1 || dix === 7 || dix === 9) && unit >= 1) {
    dixl = (dix === 1) ? '' : v[dix];
    if (dix === 1) {
      sepunit = '';
    }
    unitl = (dix === 7 && unit === 1) ?
      `${splus}et${splus}${u[10 + unit]}` : sepunit + u[10 + unit];
  }

  // Vingt-et-un, trente-et-un, quarante-et-un,
  // cinquante-et-un, soixante-et-un
  if (dix >= 2 && dix <= 6 && unit === 1) {
    unitl = `${splus}et${splus}${u[unit]}`;
  }

  // Pluriel sur 80
  if (dix === 8 && unit === 0) {
    dixl = `${v[dix]}s`;
    unitl = '';
  }

  const dizunit = sepdix + dixl + unitl;

  // Si nombre négatif
  const avjc = (n < 0) ? 'Moins ' : '';

  const res = (abs > 0) ? initialeEnCapitale(avjc + mill + centl + dizunit) :
    'Zéro';

  return res;
};