forked from woowacourse-precourse/java-calculator-7
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathExtractor.java
More file actions
72 lines (58 loc) · 2.15 KB
/
Extractor.java
File metadata and controls
72 lines (58 loc) · 2.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package calculator.model;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Extractor {
private List<Character> delimiters = new ArrayList<>(Arrays.asList(',', ':'));
private boolean isCustomDelimiter = false;
public void extractCustomDelimiter(String input) {
if(input.startsWith("//") && input.substring(3,5).equals("\\n")){
delimiters.add(input.charAt(2));
isCustomDelimiter = true;
}
}
public void extractNumbers(String input, List<Long> numbers) {
input = removeCustomDelimiter(input);
String regex = makeRegex();
// 구분자를 기준으로 문자열을 숫자들로 분리
// 이때 구분자가 아닌 문자가 포함되어 있을 수 있는데, 숫자인지 확인하는 메소드에서 걸러짐
String[] tokens = input.split(regex);
for (String token : tokens) {
if (!token.isEmpty()) {
Long number = validateIsNumber(token);
validateNegativeNumber(number);
numbers.add(number);
}
}
}
//커스텀 구분자를 제거하는 메소드
private String removeCustomDelimiter(String input) {
if(isCustomDelimiter) {
input = input.substring(5);
}
return input;
}
//구분자를 생성하는 메소드
private String makeRegex() {
StringBuilder regex = new StringBuilder("[");
for (char delimiter : delimiters) {
regex.append("\\").append(delimiter);
}
regex.append("]");
return regex.toString();
}
//분리한 문자열이 숫자인지 확인하는 메소드
private Long validateIsNumber(String input) {
try{
return Long.parseLong(input);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("잘못된 입력입니다.");
}
}
//음수인지 확인하는 메소드
private void validateNegativeNumber(Long number) {
if(number < 0) {
throw new IllegalArgumentException("음수가 포함되어 있습니다.");
}
}
}