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
106 lines (84 loc) · 3.53 KB
/
Extractor.java
File metadata and controls
106 lines (84 loc) · 3.53 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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package calculator.model;
import calculator.global.CustomDelimiterIndex;
import calculator.global.DefaultDelimiter;
import calculator.global.DelimiterMarker;
import calculator.global.MakeRegexDelimiter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Extractor {
private final List<Character> delimiters = new ArrayList<>(
Arrays.asList(DefaultDelimiter.COMMA.getKey(), DefaultDelimiter.COLON.getKey()));
private boolean hasCustomDelimiter = false;
/**
* @param input 커스텀 구분자를 추출할 문자열 조건에 맞는 커스텀 구분자를 추출하여 delimiters 필드에 추가 hasCustomDelimiter 필드를 true 변경
*/
public void extractCustomDelimiter(String input) {
if (input.startsWith(DelimiterMarker.PREFIX.getKey()) &&
input.substring(CustomDelimiterIndex.CUSTOM_DELIMITER_SUFFIX_START.getKey(),
CustomDelimiterIndex.CUSTOM_DELIMITER_SUFFIX_END.getKey() + 1)
.equals(DelimiterMarker.SUFFIX.getKey())
) {
char delimiter = input.charAt(CustomDelimiterIndex.CUSTOM_DELIMITER_INDEX.getKey());
isNumber(delimiter);
delimiters.add(delimiter);
hasCustomDelimiter = true;
}
}
/**
* @param input 숫자를 추출할 문자열
* @return 추출된 숫자의 List
*/
public List<Long> extractNumbers(String input) {
List<Long> numbers = new ArrayList<>();
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);
}
}
return numbers;
}
//숫자인지 확인하는 메소드
private void isNumber(char input) {
if (Character.isDigit(input)) {
throw new IllegalArgumentException("숫자인 구분자는 사용할 수 없습니다.");
}
}
//커스텀 구분자를 제거하는 메소드
private String removeCustomDelimiter(String input) {
if (hasCustomDelimiter) {
input = input.substring(CustomDelimiterIndex.CUSTOM_DELIMITER_SUFFIX_END.getKey() + 1);
}
return input;
}
//구분자를 생성하는 메소드
private String makeRegex() {
StringBuilder regex = new StringBuilder(MakeRegexDelimiter.OPEN_BRACKET.getKey());
for (char delimiter : delimiters) {
regex.append(MakeRegexDelimiter.START.getKey()).append(delimiter);
}
regex.append(MakeRegexDelimiter.CLOSE_BRACKET.getKey());
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("음수가 포함되어 있습니다.");
}
}
}