Files
Aislo/A00_Common/spreadsheet/spreadsheet_format_code.ts
eomsangdonandClaude Sonnet 5 e1fc529f45 feat(spreadsheet): 2단계 — 셀 서식 대화상자(Ctrl+1)
엑셀과 같은 탭 여섯 — 표시 형식(범주·소수 자리·천 단위·음수 모양·사용자 지정 코드·미리보기,
B의 numfmt로 실제 그림) · 맞춤(가로·세로·줄 바꿈·셀 병합·들여쓰기는 자리만) · 글꼴(실시간
미리보기) · 테두리(선 모양·색·위치별 적용·미리보기) · 채우기 · 보호(브레인 지시대로 자리만).
[확인] 누를 때 서식 명령 하나(+ 병합 바뀌면 병합·병합풀기)로 나감 — 도구 모음처럼 바로 안 바꿈.

표시 형식 코드 짓기는 DOM 없는 별도 파일(spreadsheet_format_code.ts)로 빼서 시험 가능하게 함
(대화상자 자체는 이 저장소에 jsdom 이 없어 단위 시험 밖 — Ctrl+1 을 이은 뒤 ORCA 로 확인할 것).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K7JS47SacjPxZ718QsZKyr
2026-09-27 21:10:46 +09:00

59 lines
2.1 KiB
TypeScript

/* =============================================================================
* spreadsheet_format_code.ts (2단계 · 주인 sub_laptop_1)
* 셀 서식 대화상자(표시 형식 탭)의 범주 → 형식 코드 짓기 — DOM · CSS 없음(시험이 바로 부름).
* 실무 자주 쓰는 모양만(일반 · 숫자 · 통화 · 회계 · 백분율 · 텍스트 · 사용자 지정).
* ========================================================================== */
export const CATEGORIES = [
"일반",
"숫자",
"통화",
"회계",
"백분율",
"텍스트",
"사용자 지정",
] as const;
export type Category = (typeof CATEGORIES)[number];
export type NegStyle = "minus" | "paren" | "red-minus" | "red-paren";
/** 범주 · 소수 자릿수 · 천단위 · 음수 표시로 형식 코드를 지음. */
export function buildCode(
cat: Category,
decimals: number,
thousands: boolean,
neg: NegStyle,
): string {
if (cat === "일반") return "";
if (cat === "텍스트") return "@";
const digits = decimals > 0 ? `0.${"0".repeat(decimals)}` : "0";
const grouped = thousands ? `#,##${digits}` : digits;
if (cat === "백분율") return `${grouped}%`;
const prefix = cat === "통화" ? '"₩"' : "";
const positive = `${prefix}${grouped}`;
if (cat === "회계") {
const acc = decimals > 0 ? "0.00" : "0";
return `_-* #,##${acc}_-;-* #,##${acc}_-;_-* "-"_-;_-@_-`;
}
switch (neg) {
case "minus":
return positive;
case "paren":
return `${positive};(${positive})`;
case "red-minus":
return `${positive};[Red]-${positive}`;
case "red-paren":
return `${positive};[Red](${positive})`;
}
}
/** 있는 형식 코드를 보고 범주를 어림(대화상자를 열 때 초기 범주 고르기). */
export function guessCategory(code: string | undefined): Category {
if (!code) return "일반";
if (code === "@") return "텍스트";
if (code.includes("%")) return "백분율";
if (code.includes("_-*")) return "회계";
if (code.includes("₩")) return "통화";
if (/[0#]/.test(code)) return "숫자";
return "사용자 지정";
}