stock.ts 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // 종목 표시용 순수 유틸 (서버·클라이언트 공용 — 'use client'/'use server' 미선언)
  2. export type ChangeDirection = 'up'|'down'|'flat';
  3. // 등락 방향 — 색+부호 병행 원칙 (d6 §5.1 색맹 대응)
  4. export function changeDirection(rate: number|null|undefined): ChangeDirection {
  5. if (rate === null || rate === undefined || rate === 0) {
  6. return 'flat';
  7. }
  8. return rate > 0 ? 'up' : 'down';
  9. }
  10. export function changeSymbol(direction: ChangeDirection): string {
  11. switch (direction) {
  12. case 'up': return '▲';
  13. case 'down': return '▼';
  14. default: return '—';
  15. }
  16. }
  17. // 천 단위 구분 숫자 (null 은 —)
  18. export function formatNumber(value: number|null|undefined): string {
  19. if (value === null || value === undefined) {
  20. return '—';
  21. }
  22. return value.toLocaleString('ko-KR');
  23. }
  24. // 등락률 % (부호는 changeSymbol 로 병행 표기하므로 절대값)
  25. export function formatChangeRate(rate: number|null|undefined): string {
  26. if (rate === null || rate === undefined) {
  27. return '—';
  28. }
  29. return `${Math.abs(rate).toFixed(2)}%`;
  30. }
  31. // 원 단위 금액 → 조/억 축약 (시가총액·거래대금)
  32. export function formatKrwCompact(value: number|null|undefined): string {
  33. if (!value) {
  34. return '—';
  35. }
  36. const eok = value / 100_000_000;
  37. if (eok >= 10_000) {
  38. const jo = Math.floor(eok / 10_000);
  39. const rest = Math.floor(eok % 10_000);
  40. return rest > 0 ? `${jo.toLocaleString('ko-KR')}조 ${rest.toLocaleString('ko-KR')}억` : `${jo.toLocaleString('ko-KR')}조`;
  41. }
  42. if (eok >= 1) {
  43. return `${Math.floor(eok).toLocaleString('ko-KR')}억`;
  44. }
  45. return `${value.toLocaleString('ko-KR')}원`;
  46. }
  47. // 거래 상태 뱃지 라벨 (정상은 뱃지 미표시)
  48. export function tradingStatusLabel(status: string): string {
  49. switch (status) {
  50. case 'Halted': return '거래정지';
  51. case 'Watch': return '관리종목';
  52. default: return '';
  53. }
  54. }