Réécrire un montant en lettres

  • Réécrire un montant en lettres

    Posté par Marielle sur 25 janvier 2024 à 10h34

    Bonjour à tous

    Je me tourne vers vous pour m’aider à trouver une formule qui permette d’écrire en lettre, un montant saisi en chiffres dans une liste sharepoint.

    Je reste à votre écoute

    Merci d’avance

    Marielle a répondu Il y a 9 mois, 2 semaines 2 Membres · 8 Réponses
  • 8 Réponses
  • Charles

    Membre
    26 janvier 2024 à 21h55

    Bonjour Marielle,

    Une des solutions consiste à passer par un script Sharepoint pour mouliner ton nombre.

    Il faut que tu ailles dans Excel Online puis que tu crées un nouveau script depuis l’onglet “Automate”.

    Dans le script tu colles le code suivant:

    <pre class=”language-javascript”>function main(workbook: ExcelScript.Workbook, nombre: number) {
    return nombreEnTexte(nombre)
    }

    function nombreEnTexte(nombre: number) {
    if (nombre < 100) {
    return replaceResult(dizaineEnTexte(nombre));
    } else if (nombre < 1000) {
    return replaceResult(centainesEnTexte(nombre));
    } else if (nombre < 1000000) {
    let milliers = Math.floor(nombre / 1000);
    let reste = nombre % 1000;
    let texte: string
    texte = nombreEnTexte(milliers) + ' mille';
    texte += (reste > 0) ? ' ' + nombreEnTexte(reste) : '';
    return replaceResult(texte);
    } else {
    return "Nombre trop grand";
    }
    }

    function centainesEnTexte(nombre: number) {
    let centaines = Math.floor(nombre / 100);
    let reste = nombre % 100;
    let texte: string
    texte = (centaines > 1) ? nombreEnTexte(centaines) + ' cent' : 'cent';
    texte += (reste > 0) ? ' ' + dizaineEnTexte(reste) : '';
    return texte;
    }

    function dizaineEnTexte(nombre: number) {
    const unites = ['zero', 'un', 'deux', 'trois', 'quatre', 'cinq', 'six', 'sept', 'huit', 'neuf'];
    const dizaines = ['', '', 'vingt', 'trente', 'quarante', 'cinquante', 'soixante', 'soixante-dix', 'quatre-vingt', 'quatre-vingt-dix'];

    if (nombre < 10) {
    return unites[nombre];
    } else if (nombre < 20) {
    return ['dix', 'onze', 'douze', 'treize', 'quatorze', 'quinze', 'seize', 'dix-sept', 'dix-huit', 'dix-neuf'][nombre - 10];
    } else if (nombre === 80) {
    return 'quatre-vingts';
    } else {
    let texte = dizaines[Math.floor(nombre / 10)];
    let reste = nombre % 10;
    if ((nombre >= 70 && nombre < 80) || (nombre >= 90)) {
    texte = nombreEnTexte(nombre - 10) + '-dix';
    reste -= 10;
    }
    texte += (reste > 0) ? ((reste === 1 && nombre !== 71) ? ' et un' : '-' + unites[reste]) : '';
    return texte;
    }
    }

    function replaceResult(texte: string){
    let texte_clean: string;
    texte_clean = texte.replace("un-dix", "onze");
    texte_clean = texte_clean.replace("quatre-vingt et onze", "quatre-vingt-onze");
    texte_clean = texte_clean.replace("deux-dix", "douze");
    texte_clean = texte_clean.replace("deux-dix", "douze");
    texte_clean = texte_clean.replace("trois-dix", "treize");
    texte_clean = texte_clean.replace("quatre-dix", "quatorze");
    texte_clean = texte_clean.replace("cinq-dix", "quinze");
    texte_clean = texte_clean.replace("six-dix", "seize");
    texte_clean = texte_clean.replace("sept-dix", "dix-sept");
    texte_clean = texte_clean.replace("huit-dix", "dix-huit");
    texte_clean = texte_clean.replace("neuf-dix", "dix-neuf");
    texte_clean = texte_clean.replace("un mille", "mille");
    return texte_clean
    }

    Tu sauvegardes ton script et ensuite tu peux l’appeler dans PowerAutomate avec la fonction

    “Run script from SharePoint library”. Tu es obligée de sélectionner un fichier Excel mais quel que soit le fichier ça fonctionne et ensuites tu renseignes ton script à executer.

    Le nombre en toutes lettres sera dans l’output de cette action

  • Marielle

    Membre
    29 janvier 2024 à 14h37

    Merci Charles pour cette excellente solution qui fonctionne parfaitement bien.
    Je voudrais juste que tu m’aides à l’améliorer afin de pouvoir convertir des montants qui peuvent aux milliards.
    J’ai testé avec 1.000.000 et en sortie, il me dit nombre trop grand.

    Merci pour ton aide précieuse

  • Charles

    Membre
    29 janvier 2024 à 16h04

    Ah oui mon code va jusqu’à 1000000 max il me semble.

    Pour 1 milliard il faudrait que je refasse des tests

  • Charles

    Membre
    29 janvier 2024 à 16h47

    Voilà un nouveau code, après il y a un peu de bidouillage et je suis pas un pro donc je garantis pas que ça fonctionne à 100%

    <pre class=”language-javascript”>function main(workbook: ExcelScript.Workbook, nombre: number) {
    return replaceResult(numberToWordsFr(nombre))
    }
    function numberToWordsFr(num: number): string {
    const units = ['zero', 'un', 'deux', 'trois', 'quatre', 'cinq', 'six', 'sept', 'huit', 'neuf'];
    const tens = ['', 'dix', 'vingt', 'trente', 'quarante', 'cinquante', 'soixante', 'soixante-dix', 'quatre-vingt', 'quatre-vingt-dix'];
    const teens = ['dix', 'onze', 'douze', 'treize', 'quatorze', 'quinze', 'seize', 'dix-sept', 'dix-huit', 'dix-neuf'];

    if (num < 10) {
    return units[num];
    } else if (num < 20) {
    return teens[num - 10];
    } else if (num < 100) {
    let unit = num % 10;
    let ten = Math.floor(num / 10);
    return tens[ten] + (unit > 0 ? '-' + units[unit] : '');
    } else if (num < 1000) {
    let hundred = Math.floor(num / 100);
    let remainder = num % 100;
    return units[hundred] + ' cent' + (remainder > 0 ? ' ' + numberToWordsFr(remainder) : '');
    } else if (num < 1000000) {
    let thousand = Math.floor(num / 1000);
    let remainder = num % 1000;
    return numberToWordsFr(thousand) + ' mille' + (remainder > 0 ? ' ' + numberToWordsFr(remainder) : '');
    } else if (num < 1000000000) {
    let million = Math.floor(num / 1000000);
    let remainder = num % 1000000;
    return numberToWordsFr(million) + ' million' + (remainder > 0 ? ' ' + numberToWordsFr(remainder) : '');
    } else if (num < 100000000000) {
    let billion = Math.floor(num / 1000000000);
    let remainder = num % 1000000000;
    return numberToWordsFr(billion) + ' milliard' + (remainder > 0 ? ' ' + numberToWordsFr(remainder) : '');
    } else {
    return 'Nombre trop grand';
    }
    }

    function replaceResult(texte: string) {
    let texte_clean: string;
    texte_clean = texte.replace("dix-un", "onze");
    texte_clean = texte_clean.replace("dix-deux", "douze");
    texte_clean = texte_clean.replace("dix-trois", "treize");
    texte_clean = texte_clean.replace("dix-quatre", "quatorze");
    texte_clean = texte_clean.replace("dix-cinq", "quinze");
    texte_clean = texte_clean.replace("dix-six", "seize");
    texte_clean = texte_clean.replace("trente-un", "trente et un");
    texte_clean = texte_clean.replace("vingt-un", "vingt et un");
    texte_clean = texte_clean.replace("quarante-un", "quarante et un");
    texte_clean = texte_clean.replace("cinquante-un", "cinquante et un");
    texte_clean = texte_clean.replace("soixante-un", "soixante et un");
    texte_clean = texte_clean.replace("soixante-onze", "soixante et onze");
    texte_clean = texte_clean.replace("soixante-dix-deux", "soixante-douze");
    texte_clean = texte_clean.replace("quatre-vingt et un", "quatre-vingt-un");
    return texte_clean
    }

  • Charles

    Membre
    29 janvier 2024 à 16h48

    Là c’est 100 milliards max

  • Marielle

    Membre
    30 janvier 2024 à 14h25

    Merci pour ton aide inestimable Charles.

    ça fonctionne très bien.

    Il y a quelques fautes encore mais on y arrive

    J’ai testé avec 18753789 :

    quand je compare avec chatgpt il manque juste ‘s’ à la fin du mot million

    je vais peut-être demander à chatgpt de m’aider à améliorer ou si entre temps il y a mieux ici je suis preneuse.

    Dans tous les cas, je tâcherai de faire un retour ici.

    Merci

  • Charles

    Membre
    1 février 2024 à 12h17

    Une des solutions consiste à ajouter des lignes à la dernière fonction

    texte_clean = texte_clean.replace(“deux million”, “deux millions”);

    texte_clean = texte_clean.replace(“trois million”, “trois millions”);

    etc…

    C’est un peu lourd mais ça contournera très bien le soucis sans toucher au code de base

  • Marielle

    Membre
    6 février 2024 à 15h30

    Merci beaucoup Charles

Connectez-vous pour répondre.