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
20 changes: 19 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,19 @@
# javascript-calculator-precourse
# javascript-calculator-precourse

## 기능

1. 문자열 입력을 요구하는 기능
2. 유효한(기본, 커스텀) 구분자를 기준으로 숫자를 추출하고 더하는 기능
쉼표(,)와 콜론(:)은 기본 구분자로, //와 \n 사이에 위치하는 문자는 커스텀 구분자로 지정
2-1) 기본 구분자 구현
2-2) 커스텀 구분자 적용 구현
3. 예외 처리

## 예외처리
1. 숫자와 유효 구분자 이외의 문자(한글, 영어)
2. 잘못된 커스텀 구분자 설정 형식
2-1) //로 시작해서 \n로 끝나지 않는 경우
2-2) 중복된 구분자를 사용하는 경우 ex) //**\n
3. 유효하지 않은 구분자 사용 ex) //*\n1,2#3
4. 음수 사용 ex) -1,-2,3
5. 소수점을 커스텀 구분자로 사용하려는 경우
2 changes: 1 addition & 1 deletion __tests__/ApplicationTest.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,4 @@ describe("문자열 계산기", () => {

await expect(app.run()).rejects.toThrow("[ERROR]");
});
});
});
62 changes: 61 additions & 1 deletion src/App.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,65 @@
import { Console } from "@woowacourse/mission-utils";

class App {
async run() {}
async run() {
const sumResult = async (input) => {
input = input.replace(/\\n/g, "\n");

let delimiter = /[,:]/;
const escapeRegExp = (str) =>
str.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&");

if (input.startsWith("//")) {
const delimiterEndIndex = input.search(/\n/);

if (delimiterEndIndex === -1) {
throw new Error("\\n이 필요합니다.");
}

let customDelimiter = input.slice(2, delimiterEndIndex);
if (/(.)\1+/.test(customDelimiter)) {
throw new Error("중복된 구분자를 사용할 수 없습니다.");
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

길이가 길어서 가독성이 떨어진다면 검증 과정의 책임을 분리해도 좋을 것 같습니다.

// if (customDelimiter === ".") {
// throw new Error(".은 구분자로 사용할 수 없습니다.");
// }
input = input.slice(delimiterEndIndex + 1);

delimiter = new RegExp(`[,:${escapeRegExp(customDelimiter)}]`);
} else if (!(input.startsWith("//") || !isNaN(Number(input[0])))) {
throw new Error("양수 또는 //로 시작해야 합니다.");
}

const inputArr = input.split(delimiter);

const sum = inputArr.reduce((acc, cur) => {
const num = Number(cur);
if (!isNaN(num)) {
if (num < 0) {
throw new Error("음수를 입력할 수 없습니다.");
}
else if (!Number.isInteger(num)){
throw new Error("정수만 입력 가능합니다.")
}
return acc + num;
} else {
throw new Error("유효하지 않은 문자가 포함되어있습니다.");
}
}, 0);

return sum.toFixed(1);
};

try {
const userInput = await Console.readLineAsync(
`덧셈할 문자열을 입력해주세요.\n`
);
const output = await sumResult(userInput);
Console.print("결과 : " + output);
} catch (error) {
throw error;
}
}
}

export default App;
2 changes: 1 addition & 1 deletion src/index.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import App from "./App.js";

const app = new App();
await app.run();
await app.run();