Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package org.codekata;
- public class StringCalculator {
- private static final String NEGATIVE_NUMBER_EXCEPTION_MSG = "negatives not allowed - ";
- private static final String DEFAULT_SEPARATOR = ",";
- private static final String OPTIONAL_DELIMITER = "//";
- public int add(String numbers) {
- if (numbersIsBlank(numbers))
- return 0;
- handleNegativeNumbers(numbers);
- if (hasOptionalDelimiter(numbers)) {
- return handleSumOfMoreThanOneNumber(extractNumberPart(numbers),
- extractDelimiter(numbers));
- }
- if (hasMoreThanOneNumber(numbers)) {
- return handleSumOfMoreThanOneNumber(numbers, DEFAULT_SEPARATOR);
- }
- return handleOneNumber(numbers);
- }
- private void handleNegativeNumbers(String numbers) {
- if (hasMoreThanOneNumber(numbers)) {
- handleMoreThanOneNegativeNumber(numbers);
- } else {
- handleOneNegativeNumber(numbers);
- }
- }
- private void handleOneNegativeNumber(String numbers) {
- if (numberHasHypen(numbers)) {
- throwNegativeNumberException(numbers);
- }
- }
- private void throwNegativeNumberException(String numbers) {
- throw new IllegalArgumentException(NEGATIVE_NUMBER_EXCEPTION_MSG
- + numbers);
- }
- private void handleMoreThanOneNegativeNumber(String numbers) {
- StringBuffer negativeNumbers = new StringBuffer();
- for (String num : numbers.split(DEFAULT_SEPARATOR)) {
- if (numberHasHypen(num)) {
- negativeNumbers.append(num).append(" ");
- }
- }
- if (negativeNumbers.length() > 0) {
- throwNegativeNumberException(negativeNumbers.toString());
- }
- }
- private boolean numberHasHypen(String numbers) {
- return numbers.contains("-");
- }
- private boolean hasOptionalDelimiter(String numbers) {
- return numbers.startsWith(OPTIONAL_DELIMITER);
- }
- private String extractDelimiter(String numbers) {
- return numbers.substring(2, 3);
- }
- private String extractNumberPart(String numbers) {
- return numbers.substring(4, numbers.length());
- }
- private int handleSumOfMoreThanOneNumber(String numbers, String delimiter) {
- int sum = 0;
- numbers = replaceNewLineToDelimiter(numbers, delimiter);
- for (String num : numbers.split(delimiter)) {
- sum += handleOneNumber(num);
- }
- return sum;
- }
- private String replaceNewLineToDelimiter(String numbers, String delimiter) {
- return numbers.replaceAll("\n", delimiter);
- }
- private boolean hasMoreThanOneNumber(String numbers) {
- return numbers.contains(DEFAULT_SEPARATOR);
- }
- private int handleOneNumber(String numbers) {
- return Integer.parseInt(numbers);
- }
- private boolean numbersIsBlank(String numbers) {
- return "".equals(numbers);
- }
- }
Add Comment
Please, Sign In to add comment