diff --git a/README.md b/README.md index bd90ef0247..547bbedfc5 100644 --- a/README.md +++ b/README.md @@ -1 +1,24 @@ -# java-calculator-precourse \ No newline at end of file +# java-calculator-precourse + +## 문자열 덧셈 계산기 + + +### 구현할 기능 + + 문자열을 받는 기능. +#### 1. 문자열의 필터링 + 문자열에 숫자를 제외한 구분자 또는 커스텀 구분자를 구분하는 필터링한다. + ++ 입력 받은 문자열에 공백인지 체크. ++ 쉼표(,), 콜론(:) 등 기본 구분자를 필터링. ++ 문자열에 "//", "\n"사이의 구분자를 구별해 커스텀 구분자로 필터링. ++ 필터링된 문자열을 문자배열로 반환 + +#### 2. 필터링된 문자열의 덧셈 ++ 필터링을 거친 문자배열을 정수 데이터로 전환하며 덧셈을 진행. ++ 덧셈 전 정수 데이터 체크. + +#### 3. 잘못된 입력에 대한 예외처리 +- 음수 입력이나 잘못된 형식의 문자에 대한 예외처리 + + + diff --git a/src/main/java/calculator/Application.java b/src/main/java/calculator/Application.java index 573580fb40..a693649d66 100644 --- a/src/main/java/calculator/Application.java +++ b/src/main/java/calculator/Application.java @@ -2,6 +2,14 @@ public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + String input = Input.inputString(); + + StringFilter strF = new StringFilter(); + Calculator cal = new Calculator(); + + String[] numbers = strF.checkString(input); + + System.out.println("결과 : " + cal.result(numbers)); + } } diff --git a/src/main/java/calculator/Calculator.java b/src/main/java/calculator/Calculator.java new file mode 100644 index 0000000000..d1c4e18b2f --- /dev/null +++ b/src/main/java/calculator/Calculator.java @@ -0,0 +1,23 @@ +package calculator; + +public class Calculator { + + + public int result(String[] s) { + int sum = 0; + + for(String number : s) { + try{ + + + if(Integer.parseInt(number) < 0) { + throw new IllegalArgumentException("음수입니다."); + } + sum += Integer.parseInt(number); + }catch(NumberFormatException e) { + throw new IllegalArgumentException("잘못된 형식의 값입니다." + Integer.parseInt(number)); + } + } + return sum; + } +} diff --git a/src/main/java/calculator/Input.java b/src/main/java/calculator/Input.java new file mode 100644 index 0000000000..d968517640 --- /dev/null +++ b/src/main/java/calculator/Input.java @@ -0,0 +1,10 @@ +package calculator; + +import camp.nextstep.edu.missionutils.Console; + +public class Input { + public static String inputString() { + System.out.println("덧셈할 문자열을 입력해 주세요."); + return Console.readLine(); + } +} diff --git a/src/main/java/calculator/StringFilter.java b/src/main/java/calculator/StringFilter.java new file mode 100644 index 0000000000..a9617cd029 --- /dev/null +++ b/src/main/java/calculator/StringFilter.java @@ -0,0 +1,39 @@ +package calculator; + + +import java.util.Arrays; + +public class StringFilter { + final String baseDelimiter = "[,|:]"; + String customDelimiter = ""; + + public String[] checkString(String input) { + input = input.replaceAll(" ", ""); + + if(input.isEmpty()) { + throw new IllegalArgumentException("잘못된 형식입니다."); + } + + if(input.contains("//") && input.contains("\\n")) { + return customDelimiterCheck(input); + } + return filteringString(input); + } + + private String[] customDelimiterCheck(String input) { + if(input.indexOf("//") > input.indexOf("\\n")) { + throw new IllegalArgumentException("커스텀 구분자를 찾을 수 없습니다."); + } + customDelimiter = input.substring(input.indexOf("//")+2, input.indexOf("\\n")); + return filteringString(input); + } + + private String[] filteringString(String input) { + String replaceInput = input.replace("//","").replace("\\n", ""); + return Arrays.stream(replaceInput.split(baseDelimiter)) + .flatMap(part -> Arrays.stream(part.split(customDelimiter))) + .filter(s -> !s.isEmpty()) + .toArray(String[]::new); + + } +} diff --git a/src/test/java/calculator/ApplicationTest.java b/src/test/java/calculator/ApplicationTest.java index 93771fb011..00c9478ea3 100644 --- a/src/test/java/calculator/ApplicationTest.java +++ b/src/test/java/calculator/ApplicationTest.java @@ -8,6 +8,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; class ApplicationTest extends NsTest { + @Test void 커스텀_구분자_사용() { assertSimpleTest(() -> { @@ -24,6 +25,7 @@ class ApplicationTest extends NsTest { ); } + @Override public void runMain() { Application.main(new String[]{});