diff --git a/README.md b/README.md index 13420b2..dd872de 100644 --- a/README.md +++ b/README.md @@ -1 +1,19 @@ -# javascript-calculator-precourse \ No newline at end of file +# 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. 소수점을 커스텀 구분자로 사용하려는 경우 \ No newline at end of file diff --git a/__tests__/ApplicationTest.js b/__tests__/ApplicationTest.js index 7c6962d..c49a66c 100644 --- a/__tests__/ApplicationTest.js +++ b/__tests__/ApplicationTest.js @@ -40,4 +40,4 @@ describe("문자열 계산기", () => { await expect(app.run()).rejects.toThrow("[ERROR]"); }); -}); +}); \ No newline at end of file diff --git a/src/App.js b/src/App.js index 091aa0a..b6e36ea 100644 --- a/src/App.js +++ b/src/App.js @@ -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("중복된 구분자를 사용할 수 없습니다."); + } + // 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; diff --git a/src/index.js b/src/index.js index 02a1d38..100dd7d 100644 --- a/src/index.js +++ b/src/index.js @@ -1,4 +1,4 @@ import App from "./App.js"; const app = new App(); -await app.run(); +await app.run(); \ No newline at end of file