전략편집기 수정
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
/**
|
||||
* API·JSON·WebSocket에서 문자열로 올 수 있는 숫자를 안전하게 처리
|
||||
*/
|
||||
export function coerceFiniteNumber(v: unknown): number | null {
|
||||
if (v == null || v === '') return null;
|
||||
if (typeof v === 'number') return Number.isFinite(v) ? v : null;
|
||||
if (typeof v === 'string') {
|
||||
const trimmed = v.trim().replace(/,/g, '');
|
||||
if (!trimmed) return null;
|
||||
const n = Number(trimmed);
|
||||
return Number.isFinite(n) ? n : null;
|
||||
}
|
||||
const n = Number(v);
|
||||
return Number.isFinite(n) ? n : null;
|
||||
}
|
||||
|
||||
/** toFixed 크래시 방지 — 숫자가 아니면 '—' */
|
||||
export function safeToFixed(v: unknown, digits = 2, fallback = '—'): string {
|
||||
const n = coerceFiniteNumber(v);
|
||||
if (n == null) return fallback;
|
||||
try {
|
||||
return n.toFixed(digits);
|
||||
} catch {
|
||||
return fallback;
|
||||
}
|
||||
}
|
||||
|
||||
export function safePercentFromRate(v: unknown, digits = 2): string {
|
||||
const n = coerceFiniteNumber(v);
|
||||
if (n == null) return '—';
|
||||
const sign = n >= 0 ? '+' : '';
|
||||
return `${sign}${safeToFixed(n * 100, digits, '0.00')}%`;
|
||||
}
|
||||
Reference in New Issue
Block a user