/** * Shared formatting utility functions. * * Consolidates duplicated formatters that were previously defined inline in * PropertyCard, ListingDetail, MobileBottomSheet, and StatsBar. */ /** Format a number as a compact GBP string, e.g. "£1.2k" or "£950". */ export function formatCurrency(value: number): string { if (value >= 1000) return `£${(value / 1000).toFixed(1)}k`; return `£${Math.round(value)}`; } /** Format a duration in seconds as a human-readable string, e.g. "12m" or "1h30m". */ export function formatDuration(seconds: number): string { const minutes = Math.round(seconds / 60); if (minutes < 60) return `${minutes}m`; const hours = Math.floor(minutes / 60); const mins = minutes % 60; return mins > 0 ? `${hours}h${mins}m` : `${hours}h`; } /** Format an ISO date string as a localised short date (e.g. "3 Jan 2025"). */ export function formatDate(value: string): string { const date = new Date(value); if (isNaN(date.getTime())) return value; return date.toLocaleDateString('en-GB', { day: 'numeric', month: 'short', year: 'numeric' }); } /** * Compute the price per square metre as a formatted string, e.g. "£4,500/m²". * Returns null when square metres data is unavailable. */ export function formatPricePerSqm(price: number, sqm: number | null | undefined): string | null { if (sqm == null || sqm <= 0) return null; return `£${Math.round(price / sqm).toLocaleString()}/m²`; }