/* ============================================================================= * M02_DF_Round.ts * 끝수 — 출력 칸 수식을 ROUND 계열로 감쌈 · 감싼 것을 읽음 · DOM 없음 * 소수자리 제안은 단위 표준(M02_DF_UnitPick.suggestPlaces) · 주 ① 반올림 · ② 항목 값 우선 * ========================================================================== */ export type RoundMode = "반올림" | "올림" | "버림"; export const ROUND_FN: Record = { 반올림: "ROUND", 올림: "ROUNDUP", 버림: "ROUNDDOWN", }; export interface RoundSpec { places: number; mode: RoundMode; } const WRAPPED = /^(ROUND|ROUNDUP|ROUNDDOWN)\((.*),\s*(-?\d+)\s*\)$/s; /** 칸 수식(앞 = 뺀 글) → 끝수 · 안 감싸였으면 null */ export function parseRound(formula: string): { spec: RoundSpec; inner: string } | null { const m = WRAPPED.exec(formula.trim()); if (!m) return null; const mode = (Object.keys(ROUND_FN) as RoundMode[]).find((k) => ROUND_FN[k] === m[1]); return mode ? { spec: { places: Number(m[3]), mode }, inner: m[2] } : null; } /** 안쪽 글에 끝수를 씌움 — spec 이 null 이면 벗김 */ export function wrapRound(inner: string, spec: RoundSpec | null): string { return spec ? `${ROUND_FN[spec.mode]}(${inner}, ${spec.places})` : inner; }