diff --git a/README.md b/README.md index 13420b29..af6e06f2 100644 --- a/README.md +++ b/README.md @@ -1 +1,19 @@ -# javascript-calculator-precourse \ No newline at end of file +# javascript-calculator-precourse + +## 기능 요구 사항 + +1. 입력 문자열 파싱 및 기본 처리 + +- 입력 문자열이 빈 문자열이거나 null인 경우에 0을 반환한다. +- 입력 문자열에 숫자 하나만 있는 경우 해당 숫자를 반환한다. +- 문자열에 포함된 쉼표 또는 콜론을 구분자로 사용하여 숫자를 분리한다. + +2. 커스텀 구분자 처리 + +- 문자열 앞부분의 "//"와 "\n" 사이에 위치하는 문자를 커스텀 구분자로 정한다. +- 커스텀 구분자를 사용해 숫자를 분리하고 합을 계산한다. + +3. 예외처리 + +- 음수가 포함된 경우 "[error]" 메시지와 함께 error를 발생시키고 애플리케이션을 종료한다. +- 숫자가 아닌 문자가 포함될 경우 [error]메시지와 함께 error를 발생시키고 애플리케이션을 종료한다. diff --git a/src/App.js b/src/App.js index 091aa0a5..6f0ad7f1 100644 --- a/src/App.js +++ b/src/App.js @@ -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; diff --git a/src/calculator.js b/src/calculator.js new file mode 100644 index 00000000..d9f267f6 --- /dev/null +++ b/src/calculator.js @@ -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; +}