| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- // 종목 표시용 순수 유틸 (서버·클라이언트 공용 — '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 '';
- }
- }
|