diff --git a/README.md b/README.md index 13420b29..2a00e278 100644 --- a/README.md +++ b/README.md @@ -1 +1,12 @@ -# javascript-calculator-precourse \ No newline at end of file +# javascript-calculator-precourse +1. 빈 문자열("")또는 null 입력 시 합계로 0을 반환한다. +2. 쉼표(,)를 구분자로 사용하여 숫자를 분리하고 덧셈을 수행한다. +3. 콜론(;)을 구분자로 사용하여 숫자를 분리하고 덧셈을 수행한다. +4. 쉼표와 콜론이 혼용된 경우에도 정상적으로 분리하여 덧셈을 수행한다. +5. 문자열 시작의 //와 \n 사이에 위치한 문자를 커스텀 구분자로 인식한다. +6. 커스텀 구분자를 사용하여 숫자를 분리하고 덧셈 결과를 반환한다. +7. 입력 문자열에 음수가 포함될 경우 [ERROR]로 시작하는 메시지와 함께 Error를 발생시킨다. +8. 입력 문자열에 숫자가 아닌 다른 값이 포함될 경우 [ERROR] 로 시작하는 메시지와 함께 Error를 발생시킨다. +9. Console.readLineAsync()를 사용해서 문자열을 입력받는다. +10. Console.print()를 사용해서 결과:[숫자]형식으로 출력한다. +11. 프로그램 실행 시작점은 App.js의 run() 함수를 따른다. \ No newline at end of file diff --git a/src/App.js b/src/App.js index 091aa0a5..696067b3 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,24 @@ +import { Console } from "@woowacourse/mission-utils"; +import StringAddCalculator from "./StringAddCalculator. + class App { - async run() {} + // 11번 기능 + async run() { + try { + // 9번 기능 + const inputString = await Console.readLineAsync("덧셈할 문자열을 입력해 주세요.\n"); + + // 1~8번 기능을 가진 add 함수를 호출해서 계산 + const result = StringAddCalculator.add(inputString); + + // 10번 기능 + Console.print(`결과 : ${result}`); + + } catch (error) { + // 7, 8번 예외 처리 발생 시 메시지 출력 + Console.print(error.message); + } + } } -export default App; +export default App; \ No newline at end of file diff --git a/src/StringAddCalculator.js b/src/StringAddCalculator.js new file mode 100644 index 00000000..0d082e99 --- /dev/null +++ b/src/StringAddCalculator.js @@ -0,0 +1,43 @@ +class StringAddCalculator { + static add(text) { + // 1번 기능: 빈 문자열("") 또는 null 입력 시 0 반환 + if (text === null || text === undefined || text.length === 0) { + return 0; + } + + // 2번, 3번 기능 + const numbers = text.split(/[,:]/); // 쉼표(,) 또는 콜론(:)을 기준으로 구분 + let calculationText = text; + // 5번, 6번 기능 구현 시작 + const customMatch = calculationText.match(CUSTOM_DELIMITER_REGEX); + + if (customMatch) { + const customDelimiter = customMatch[1]; + delimiters = `[,:|${customDelimiter.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')}]`; + calculationText = calculationText.replace(CUSTOM_DELIMITER_REGEX, ''); + } + + // 2, 3번 기능: 쉼표(,), 콜론(:), 그리고 커스텀 구분자를 포함하여 분리 + const numbers = calculationText.split(new RegExp(delimiters)); + let sum = 0; + for (const numberString of numbers) { + const trimmedString = numberString.trim(); + if (trimmedString === "") continue; + + const number = parseInt(trimmedString, 10); + // 8번 기능(에러) + if (isNaN(number)) { + throw new Error("[ERROR] 숫자만 입력할 수 있습니다."); + } + //7번 기능(에러) + if (number < 0) { + throw new Error("[ERROR] 음수는 입력할 수 없습니다."); + } + sum += number; + } + + return sum; + } +} + +export default StringAddCalculator; \ No newline at end of file