| |
| |
| |
| |
|
|
| |
|
|
| const trLocale = 'tr-TR' |
| const usLocale = 'en-US' |
|
|
| function loc(market?: 'bist' | 'us') { return market === 'us' ? usLocale : trLocale } |
|
|
| |
| |
| |
| |
| export function formatPrice(value: number | null | undefined, currency = 'βΊ', market?: 'bist' | 'us'): string { |
| if (value == null || !Number.isFinite(value)) return 'β' |
| const formatted = value.toLocaleString(loc(market), { |
| minimumFractionDigits: 2, |
| maximumFractionDigits: 2, |
| }) |
| return currency ? `${currency}${formatted}` : formatted |
| } |
|
|
| |
| |
| |
| export function formatNumber(value: number | null | undefined, decimals = 2, market?: 'bist' | 'us'): string { |
| if (value == null || !Number.isFinite(value)) return 'β' |
| return value.toLocaleString(loc(market), { |
| minimumFractionDigits: decimals, |
| maximumFractionDigits: decimals, |
| }) |
| } |
|
|
| |
| |
| |
| |
| export function formatPercent(value: number | null | undefined, decimals = 2, market?: 'bist' | 'us'): string { |
| if (value == null || !Number.isFinite(value)) return 'β' |
| const sign = value > 0 ? '+' : '' |
| return `${sign}${value.toLocaleString(loc(market), { |
| minimumFractionDigits: decimals, |
| maximumFractionDigits: decimals, |
| })}%` |
| } |
|
|
| |
| |
| |
| |
| export function formatCompact(value: number | null | undefined, market?: 'bist' | 'us'): string { |
| if (value == null || !Number.isFinite(value)) return 'β' |
| const abs = Math.abs(value) |
| const sign = value < 0 ? '-' : '' |
| const l = loc(market) |
|
|
| if (abs >= 1_000_000_000) { |
| return `${sign}${(abs / 1_000_000_000).toLocaleString(l, { maximumFractionDigits: 1 })}B` |
| } |
| if (abs >= 1_000_000) { |
| return `${sign}${(abs / 1_000_000).toLocaleString(l, { maximumFractionDigits: 1 })}M` |
| } |
| if (abs >= 1_000) { |
| return `${sign}${(abs / 1_000).toLocaleString(l, { maximumFractionDigits: 1 })}K` |
| } |
| return value.toLocaleString(l, { maximumFractionDigits: 0 }) |
| } |
|
|
| |
| |
| |
| export function formatVolume(value: number | null | undefined): string { |
| return formatCompact(value) |
| } |
|
|
| |
|
|
| |
| |
| |
| |
| export function formatDate(date: string | Date | null | undefined, market?: 'bist' | 'us'): string { |
| if (!date) return 'β' |
| try { |
| const d = typeof date === 'string' ? new Date(date) : date |
| if (isNaN(d.getTime())) return 'β' |
| return d.toLocaleDateString(loc(market), { |
| day: 'numeric', |
| month: 'short', |
| year: 'numeric', |
| }) |
| } catch { |
| return 'β' |
| } |
| } |
|
|
| |
| |
| |
| export function formatDateTime(date: string | Date | null | undefined, market?: 'bist' | 'us'): string { |
| if (!date) return 'β' |
| try { |
| const d = typeof date === 'string' ? new Date(date) : date |
| if (isNaN(d.getTime())) return 'β' |
| return d.toLocaleDateString(loc(market), { |
| day: 'numeric', |
| month: 'short', |
| year: 'numeric', |
| hour: '2-digit', |
| minute: '2-digit', |
| }) |
| } catch { |
| return 'β' |
| } |
| } |
|
|
| |
| |
| |
| export function formatRelativeTime(date: string | Date | null | undefined, market?: 'bist' | 'us'): string { |
| if (!date) return 'β' |
| try { |
| const d = typeof date === 'string' ? new Date(date) : date |
| if (isNaN(d.getTime())) return 'β' |
|
|
| const now = Date.now() |
| const diffMs = now - d.getTime() |
| const diffSec = Math.floor(diffMs / 1000) |
| const diffMin = Math.floor(diffSec / 60) |
| const diffHours = Math.floor(diffMin / 60) |
| const diffDays = Math.floor(diffHours / 24) |
|
|
| const isUS = market === 'us' |
| if (diffSec < 60) return isUS ? 'Just now' : 'Az ΓΆnce' |
| if (diffMin < 60) return isUS ? `${diffMin}m ago` : `${diffMin} dakika ΓΆnce` |
| if (diffHours < 24) return isUS ? `${diffHours}h ago` : `${diffHours} saat ΓΆnce` |
| if (diffDays < 7) return isUS ? `${diffDays}d ago` : `${diffDays} gΓΌn ΓΆnce` |
| if (diffDays < 30) return isUS ? `${Math.floor(diffDays / 7)}w ago` : `${Math.floor(diffDays / 7)} hafta ΓΆnce` |
| return formatDate(d, market) |
| } catch { |
| return 'β' |
| } |
| } |
|
|