/** * Mises en forme partagées des montants et des dates. * * Chaque composant redéfinissait son `formatAmount`, avec des variantes * d'arrondi et de séparateur : deux écrans pouvaient écrire différemment le * même euro. Les nouveaux affichages passent par ici. */ const EUROS = new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', maximumFractionDigits: 0 }) const EUROS_PRECIS = new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR' }) const MOIS_COURTS = [ 'janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.' ] /** Montant arrondi à l'euro, pour les chiffres qu'on lit d'un coup d'œil. */ export function formatMontant(valeur) { if (valeur == null) return '—' return EUROS.format(valeur) } /** Montant au centime, pour les écarts et les rapprochements. */ export function formatMontantPrecis(valeur) { if (valeur == null) return '—' return EUROS_PRECIS.format(valeur) } /** Montant signé, le « + » explicite pour ce qui revient au propriétaire. */ export function formatEcart(valeur) { if (valeur == null) return '—' const signe = valeur > 0 ? '+' : '' return `${signe}${EUROS_PRECIS.format(valeur)}` } /** "2026-06-22" → "22/06/2026" */ export function formatDate(chaine) { if (!chaine) return '—' const [annee, mois, jour] = chaine.split('-') return `${jour}/${mois}/${annee}` } /** "2026-06" → "juin" (l'année est portée par le titre de la période) */ export function formatMois(chaine) { if (!chaine) return '' const [, mois] = chaine.split('-') return MOIS_COURTS[parseInt(mois, 10) - 1] ?? chaine } /** * "2026-06" → "juin 26", pour les séries qui traversent plusieurs années. * * `formatMois` suffit quand un titre porte déjà l'année ; sur trois ans de * comptes rendus, deux mois de juin se confondraient. */ export function formatMoisAnnee(chaine) { if (!chaine) return '' const [annee, mois] = chaine.split('-') return `${MOIS_COURTS[parseInt(mois, 10) - 1] ?? mois} ${annee.slice(2)}` }