Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,9 @@
# javascript-calculator-precourse
# javascript-calculator-precourse

## 기능 목록

- [ ] 빈 문자열 ("") 입력시 0을 반환
- [ ] 쉼표(,) / 콜론(:)으로 숫자 구분 후 합 구하기
- [ ] 커스텀 구분자는 "//<커스텀구분자>\n<numbers>" 형식으로 지원 (ex. "//;\n1;2;3" -> 6)
- [ ] 결과 값의 형식은 '결과 : <합>' 으로 출력
- [ ] 잘못된 입력 값은 "[ERROR]"로 시작하는 메시지와 Error 발생 후 종료 (process.exit() 미사용)
2 changes: 2 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

24 changes: 23 additions & 1 deletion src/App.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,27 @@
import { Console } from "@woowacourse/mission-utils";
import Calculator from "./Calculator.js";
import { ERR } from "./constants/errors.js";

class App {
async run() {}
async run() {
try {
// 입력 받기
const INPUT = await Console.readLineAsync(
"덧셈할 문자열을 입력해 주세요."
);
// 계산 처리
const RESULT = Calculator.add(INPUT);
// 결과 출력
Console.print(`결과 : ${RESULT}`);
} catch (err) {
const msg =
err && typeof err.message === "string"
? err.message
: `[ERROR] ${ERR.UNKNOWN}`;
Console.print(msg);
throw err;
}
}
}

export default App;
43 changes: 43 additions & 0 deletions src/Calculator.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import { fail } from "./utils/errors.js";

const Calculator = {
add(input) {
// 빈 문자열 처리
if (input === "") return 0;

// 커스텀 구분자 처리
const headerMatch = input.match(/^\/\/(.)(?:\\n|\n)/);

// 숫자 영역 추출 (헤더 존재시 헤더 이후부터, 없으면 전체 사용)
const numbersPart = headerMatch
? input.slice(headerMatch[0].length)
: input;

// 숫자 존재 여부 확인
if (headerMatch && numbersPart === "") fail("EMPTY_NUMBER");

// 구분자 정규식 (',', ':', 커스텀 구분자)
const delimiterRegex = new RegExp(
`[,:${
headerMatch
? headerMatch[1].replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&")
: ""
}]`
);

// 숫자 분리 (배열 변환)
const values = numbersPart.split(delimiterRegex);

// 유효성 검증 (빈 밸류, 비숫자, 음수)
for (const value of values) {
if (value === "") fail("EMPTY_VALUE");
if (!/^-?\d+$/.test(value)) fail("NON_NUMBER");
if (Number(value) < 0) fail("NEGATIVE_NUMBER");
}

// 숫자 합산
return values.reduce((acc, cur) => acc + Number(cur), 0);
},
};

export default Calculator;
7 changes: 7 additions & 0 deletions src/constants/errors.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export const ERR = {
EMPTY_NUMBER: "숫자 목록이 비어 있습니다.",
EMPTY_VALUE: "비어 있는 값이 포함되어 있습니다.",
NON_NUMBER: "숫자가 아닌 값이 포함되어 있습니다.",
NEGATIVE_NUMBER: "음수는 입력할 수 없습니다.",
UNKNOWN: "알 수 없는 오류가 발생했습니다.",
};
4 changes: 0 additions & 4 deletions src/index.js

This file was deleted.

6 changes: 6 additions & 0 deletions src/utils/errors.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { ERR } from "../constants/errors.js";

export const fail = (code) => {
const msg = ERR[code] || ERR.UNKNOWN;
throw new Error(`[ERROR] ${msg}`);
};