export const fmtCAD = (v: number, digits = 0): string => new Intl.NumberFormat('fr-CA', { style: 'currency', currency: 'CAD', maximumFractionDigits: digits }).format(v); export const fmtNum = (v: number, digits = 2): string => new Intl.NumberFormat('fr-CA', { maximumFractionDigits: digits }).format(v); export const fmtPct = (v: number, digits = 1): string => new Intl.NumberFormat('fr-CA', { style: 'percent', maximumFractionDigits: digits }).format(v); export const m2ToPi2 = (m2: number): number => m2 * 10.7639; export const pi2ToM2 = (pi2: number): number => pi2 / 10.7639; export function fmtDate(iso: string): string { const d = new Date(iso.endsWith('Z') || iso.includes('+') ? iso : iso + 'Z'); const now = new Date(); const sameDay = d.toDateString() === now.toDateString(); if (sameDay) return `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`; return d.toLocaleDateString('fr-CA', { day: 'numeric', month: 'short' }); } export function fmtBytes(n: number): string { if (n < 1024) return `${n} o`; if (n < 1024 * 1024) return `${(n / 1024).toFixed(0)} Ko`; return `${(n / 1024 / 1024).toFixed(1)} Mo`; } export function fmtDuration(ms: number): string { return ms < 1000 ? `${ms} ms` : `${(ms / 1000).toFixed(1)} s`; } export function cellValue(v: unknown): string { if (v === null || v === undefined) return ''; if (typeof v === 'number') return Number.isInteger(v) ? fmtNum(v, 0) : fmtNum(v, 2); return String(v); }