/** * NumberDisplay * * Deterministic number formatting for display. * Avoids Intl and toLocaleString to prevent SSR/hydration mismatches. */ export class NumberDisplay { /** * Formats a number with thousands separators (commas). * Example: 1234567 -> "1,234,567" */ static format(value: number): string { const parts = value.toString().split('.'); parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ','); return parts.join('.'); } /** * Formats a number in compact form (e.g., 1.2k, 1.5M). */ static formatCompact(value: number): string { if (value >= 1000000) { return `${(value / 1000000).toFixed(1)}M`; } if (value >= 1000) { return `${(value / 1000).toFixed(1)}k`; } return value.toString(); } }