/** * Currency formatting utilities for the WealthX design system. * All formatters default to AUD (en-AU locale). */ /** * Format a number as AUD currency using Intl.NumberFormat. * * @param value The numeric value to format. * @param options Optional formatting overrides. * @param options.decimals Decimal places (default: 0). * @param options.showSign Prefix with +/− for positive/negative (default: false). */ export function formatCurrency( value: number, options?: { decimals?: number; showSign?: boolean }, ): string { const { decimals = 0, showSign = false } = options ?? {}; const abs = Math.abs(value); const formatted = new Intl.NumberFormat("en-AU", { style: "currency", currency: "AUD", minimumFractionDigits: decimals, maximumFractionDigits: decimals, }).format(abs); if (!showSign) return value < 0 ? `-${formatted}` : formatted; if (value > 0) return `+${formatted}`; if (value < 0) return `-${formatted}`; return formatted; } /** * Abbreviated currency: $1.2B, $3.5M, $580K, $42. * Used primarily for chart axis ticks. */ export function formatCurrencyAbbrev(value: number, decimals?: number): string { const abs = Math.abs(value); const sign = value < 0 ? "-" : ""; if (abs >= 1_000_000_000) return `${sign}$${(abs / 1_000_000_000).toFixed(decimals ?? 1)}B`; if (abs >= 1_000_000) return `${sign}$${(abs / 1_000_000).toFixed(decimals ?? 1)}M`; if (abs >= 1_000) return `${sign}$${(abs / 1_000).toFixed(decimals ?? 0)}K`; return `${sign}$${abs.toFixed(decimals ?? 0)}`; }