|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function formatNumber(num) { |
|
|
if (num === null || num === undefined) return 'β'; |
|
|
|
|
|
const absNum = Math.abs(num); |
|
|
|
|
|
if (absNum >= 1e9) { |
|
|
return (num / 1e9).toFixed(2) + 'B'; |
|
|
} |
|
|
if (absNum >= 1e6) { |
|
|
return (num / 1e6).toFixed(2) + 'M'; |
|
|
} |
|
|
if (absNum >= 1e3) { |
|
|
return (num / 1e3).toFixed(2) + 'K'; |
|
|
} |
|
|
|
|
|
return num.toFixed(0); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function formatCurrency(num, decimals = 2) { |
|
|
if (num === null || num === undefined) return '$β'; |
|
|
|
|
|
const absNum = Math.abs(num); |
|
|
|
|
|
if (absNum >= 1e9) { |
|
|
return '$' + (num / 1e9).toFixed(2) + 'B'; |
|
|
} |
|
|
if (absNum >= 1e6) { |
|
|
return '$' + (num / 1e6).toFixed(2) + 'M'; |
|
|
} |
|
|
if (absNum >= 1e3) { |
|
|
return '$' + (num / 1e3).toFixed(2) + 'K'; |
|
|
} |
|
|
|
|
|
return '$' + num.toFixed(decimals); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function formatPercentage(num, decimals = 2) { |
|
|
if (num === null || num === undefined) return 'β%'; |
|
|
return (num >= 0 ? '+' : '') + num.toFixed(decimals) + '%'; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function formatDate(date) { |
|
|
if (!date) return 'β'; |
|
|
const d = new Date(date); |
|
|
return d.toLocaleDateString('en-US', { |
|
|
year: 'numeric', |
|
|
month: 'short', |
|
|
day: 'numeric' |
|
|
}); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function formatTime(date) { |
|
|
if (!date) return 'β'; |
|
|
const d = new Date(date); |
|
|
return d.toLocaleTimeString('en-US', { |
|
|
hour: '2-digit', |
|
|
minute: '2-digit' |
|
|
}); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function formatRelativeTime(date) { |
|
|
if (!date) return 'β'; |
|
|
|
|
|
const now = new Date(); |
|
|
const d = new Date(date); |
|
|
const diffMs = now - d; |
|
|
const diffSec = Math.floor(diffMs / 1000); |
|
|
const diffMin = Math.floor(diffSec / 60); |
|
|
const diffHour = Math.floor(diffMin / 60); |
|
|
const diffDay = Math.floor(diffHour / 24); |
|
|
|
|
|
if (diffSec < 60) return 'just now'; |
|
|
if (diffMin < 60) return `${diffMin}m ago`; |
|
|
if (diffHour < 24) return `${diffHour}h ago`; |
|
|
if (diffDay < 7) return `${diffDay}d ago`; |
|
|
|
|
|
return formatDate(date); |
|
|
} |
|
|
|