domesticSummary.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // 국내 증시 요약 도메인 타입 — Backend Application/Features/Api/Stocks/GetDomesticSummary/Response.cs 대응
  2. // 필드명 camelCase. flucRateBp = %×100. 투자자별·베이시스는 Phase 2(현재 null → "–").
  3. export interface DomesticIndexRow {
  4. key: string; // kospi | kosdaq | kospi200
  5. name: string;
  6. close: number;
  7. changeVal: number;
  8. flucRateBp: number;
  9. tradeDate: string;
  10. // 등락 종목 수 (코스피/코스닥만; KOSPI200 은 null)
  11. advances?: number|null;
  12. declines?: number|null;
  13. unchanged?: number|null;
  14. limitUp?: number|null;
  15. limitDown?: number|null;
  16. // 투자자별 순매수(억원) — Phase 2
  17. individualNet?: number|null;
  18. foreignNet?: number|null;
  19. institutionNet?: number|null;
  20. programNet?: number|null;
  21. // 베이시스 (KOSPI200) — Phase 2
  22. basis?: number|null;
  23. }
  24. export interface DomesticSummaryResponse {
  25. list: DomesticIndexRow[];
  26. }
  27. // 전일비 절대값 — "45.12" (부호/색은 방향으로 별도)
  28. export function formatIndexChange(v: number): string {
  29. return Math.abs(v).toLocaleString('ko-KR', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
  30. }
  31. // 투자자별 순매수 — "-13,277억원" / "1,347억원", null 은 "–"
  32. export function formatNet(v?: number|null): string {
  33. if (v === null || v === undefined) {
  34. return '–';
  35. }
  36. return `${v.toLocaleString('ko-KR')}억원`;
  37. }
  38. // 종목 수 — null 은 "–"
  39. export function formatCount(v?: number|null): string {
  40. if (v === null || v === undefined) {
  41. return '–';
  42. }
  43. return v.toLocaleString('ko-KR');
  44. }
  45. // 순매수 방향 (색상용)
  46. export function netDir(v?: number|null): 'up'|'down'|'flat' {
  47. if (v === null || v === undefined || v === 0) {
  48. return 'flat';
  49. }
  50. return v > 0 ? 'up' : 'down';
  51. }