Réécrire un montant en lettres
-
Réécrire un montant en lettres
Posté par Marielle sur 25 janvier 2024 à 10h34Bonjour à 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
-
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
-
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
-
Ah oui mon code va jusqu’à 1000000 max il me semble.
Pour 1 milliard il faudrait que je refasse des tests
-
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
} -
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
-
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
Connectez-vous pour répondre.