Guest User

Untitled

a guest
Jul 20th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.99 KB | None | 0 0
  1. package org.codekata;
  2.  
  3. public class StringCalculator {
  4.  
  5. private static final String NEGATIVE_NUMBER_EXCEPTION_MSG = "negatives not allowed - ";
  6.  
  7. private static final String DEFAULT_SEPARATOR = ",";
  8.  
  9. private static final String OPTIONAL_DELIMITER = "//";
  10.  
  11. public int add(String numbers) {
  12. if (numbersIsBlank(numbers))
  13. return 0;
  14. handleNegativeNumbers(numbers);
  15. if (hasOptionalDelimiter(numbers)) {
  16. return handleSumOfMoreThanOneNumber(extractNumberPart(numbers),
  17. extractDelimiter(numbers));
  18. }
  19. if (hasMoreThanOneNumber(numbers)) {
  20. return handleSumOfMoreThanOneNumber(numbers, DEFAULT_SEPARATOR);
  21. }
  22. return handleOneNumber(numbers);
  23. }
  24.  
  25. private void handleNegativeNumbers(String numbers) {
  26. if (hasMoreThanOneNumber(numbers)) {
  27. handleMoreThanOneNegativeNumber(numbers);
  28. } else {
  29. handleOneNegativeNumber(numbers);
  30. }
  31. }
  32.  
  33. private void handleOneNegativeNumber(String numbers) {
  34. if (numberHasHypen(numbers)) {
  35. throwNegativeNumberException(numbers);
  36. }
  37. }
  38.  
  39. private void throwNegativeNumberException(String numbers) {
  40. throw new IllegalArgumentException(NEGATIVE_NUMBER_EXCEPTION_MSG
  41. + numbers);
  42. }
  43.  
  44. private void handleMoreThanOneNegativeNumber(String numbers) {
  45. StringBuffer negativeNumbers = new StringBuffer();
  46. for (String num : numbers.split(DEFAULT_SEPARATOR)) {
  47. if (numberHasHypen(num)) {
  48. negativeNumbers.append(num).append(" ");
  49. }
  50. }
  51. if (negativeNumbers.length() > 0) {
  52. throwNegativeNumberException(negativeNumbers.toString());
  53. }
  54. }
  55.  
  56. private boolean numberHasHypen(String numbers) {
  57. return numbers.contains("-");
  58. }
  59.  
  60. private boolean hasOptionalDelimiter(String numbers) {
  61. return numbers.startsWith(OPTIONAL_DELIMITER);
  62. }
  63.  
  64. private String extractDelimiter(String numbers) {
  65. return numbers.substring(2, 3);
  66. }
  67.  
  68. private String extractNumberPart(String numbers) {
  69. return numbers.substring(4, numbers.length());
  70. }
  71.  
  72. private int handleSumOfMoreThanOneNumber(String numbers, String delimiter) {
  73. int sum = 0;
  74. numbers = replaceNewLineToDelimiter(numbers, delimiter);
  75. for (String num : numbers.split(delimiter)) {
  76. sum += handleOneNumber(num);
  77. }
  78. return sum;
  79. }
  80.  
  81. private String replaceNewLineToDelimiter(String numbers, String delimiter) {
  82. return numbers.replaceAll("\n", delimiter);
  83. }
  84.  
  85. private boolean hasMoreThanOneNumber(String numbers) {
  86. return numbers.contains(DEFAULT_SEPARATOR);
  87. }
  88.  
  89. private int handleOneNumber(String numbers) {
  90. return Integer.parseInt(numbers);
  91. }
  92.  
  93. private boolean numbersIsBlank(String numbers) {
  94. return "".equals(numbers);
  95. }
  96.  
  97. }
Add Comment
Please, Sign In to add comment