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. 입력 문자열 파싱 및 기본 처리

- 입력 문자열이 빈 문자열이거나 null인 경우에 0을 반환한다.
- 입력 문자열에 숫자 하나만 있는 경우 해당 숫자를 반환한다.
- 문자열에 포함된 쉼표 또는 콜론을 구분자로 사용하여 숫자를 분리한다.

2. 커스텀 구분자 처리

- 문자열 앞부분의 "//"와 "\n" 사이에 위치하는 문자를 커스텀 구분자로 정한다.
- 커스텀 구분자를 사용해 숫자를 분리하고 합을 계산한다.

3. 예외처리

- 음수가 포함된 경우 "[error]" 메시지와 함께 error를 발생시키고 애플리케이션을 종료한다.
- 숫자가 아닌 문자가 포함될 경우 [error]메시지와 함께 error를 발생시키고 애플리케이션을 종료한다.
11 changes: 10 additions & 1 deletion src/App.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
import { Console } from "@woowacourse/mission-utils";
import { add } from "./calculator.js";

class App {
async run() {}
async run() {
const input = await Console.readLineAsync(
"덧셈할 문자열을 입력해 주세요.\n"
);
const result = add(input);
Console.print(`결과 : ${result}`);
}
}

export default App;
47 changes: 47 additions & 0 deletions src/calculator.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
export function add(text) {
let input = text;
if (text && text.startsWith('"') && text.endsWith('"')) {
input = text.slice(1, -1);
}

if (input && input.includes("\\n")) {
input = input.replace(/\\n/g, "\n");
}

if (input === null || input.length === 0) {
return 0;
}

let delimiter = /[,\:]/;
let numbers = input;

if (input.startsWith("//")) {
const delimiterEndIndex = input.indexOf("\n");
if (delimiterEndIndex === -1) {
throw new Error("[ERROR] 커스텀 구분자 형식이 올바르지 않습니다.");
}
const customDelimiter = input.substring(2, delimiterEndIndex);
const escapedDelimiter = customDelimiter.replace(
/[.*+?^${}()|[\]\\]/g,
"\\$&"
);
delimiter = new RegExp(escapedDelimiter);
numbers = input.substring(delimiterEndIndex + 1);
}

const numberArray = numbers.split(delimiter);
let sum = 0;
for (const number of numberArray) {
if (number === "") continue;
const num = Number(number);
if (isNaN(num)) {
throw new Error("[ERROR] 숫자가 아닌 값이 입력되었습니다.");
}
if (num < 0) {
throw new Error("[ERROR] 음수는 입력할 수 없습니다.");
}
sum += num;
}

return sum;
}