// 종목 표시용 순수 유틸 (서버·클라이언트 공용 — 'use client'/'use server' 미선언) export type ChangeDirection = 'up'|'down'|'flat'; // 등락 방향 — 색+부호 병행 원칙 (d6 §5.1 색맹 대응) export function changeDirection(rate: number|null|undefined): ChangeDirection { if (rate === null || rate === undefined || rate === 0) { return 'flat'; } return rate > 0 ? 'up' : 'down'; } export function changeSymbol(direction: ChangeDirection): string { switch (direction) { case 'up': return '▲'; case 'down': return '▼'; default: return '—'; } } // 천 단위 구분 숫자 (null 은 —) export function formatNumber(value: number|null|undefined): string { if (value === null || value === undefined) { return '—'; } return value.toLocaleString('ko-KR'); } // 등락률 % (부호는 changeSymbol 로 병행 표기하므로 절대값) export function formatChangeRate(rate: number|null|undefined): string { if (rate === null || rate === undefined) { return '—'; } return `${Math.abs(rate).toFixed(2)}%`; } // 원 단위 금액 → 조/억 축약 (시가총액·거래대금) export function formatKrwCompact(value: number|null|undefined): string { if (!value) { return '—'; } const eok = value / 100_000_000; if (eok >= 10_000) { const jo = Math.floor(eok / 10_000); const rest = Math.floor(eok % 10_000); return rest > 0 ? `${jo.toLocaleString('ko-KR')}조 ${rest.toLocaleString('ko-KR')}억` : `${jo.toLocaleString('ko-KR')}조`; } if (eok >= 1) { return `${Math.floor(eok).toLocaleString('ko-KR')}억`; } return `${value.toLocaleString('ko-KR')}원`; } // 거래 상태 뱃지 라벨 (정상은 뱃지 미표시) export function tradingStatusLabel(status: string): string { switch (status) { case 'Halted': return '거래정지'; case 'Watch': return '관리종목'; default: return ''; } }