> For the complete documentation index, see [llms.txt](https://asos.gitbook.io/coding-style/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://asos.gitbook.io/coding-style/katas/untitled.md).

# String calculator

We use this kata to develop the fundamentals of classic TDD.

## Overview

In the string calculator kata, you write a method which calculates the sum of the numbers passed to it. However, the method takes only one parameter, which is a string. You must therefore parse and convert the string before being able to perform the calculation.

## Objectives

Write a program which exposes a method with the following signature:

`int Add(string bowlingGameScores)`

The must remain the same as you work through the following objectives:

#### **Parse the input and return the correct sum of the numbers**

* If the input is empty, return 0.
* If the input contains a single number, return that number.
* If the input contains two numbers separated by a comma, return the sum of the two numbers, e.g. `"1,2"` returns 3.

  * The comma delimiter cannot appear at the beginning or the end of the line, e.g. `",1,2"` or `"1,2,"`
  * The comma delimiter cannot appear more than once in a row, e.g. `"1,,2"`

#### **Handle an unknown amount of numbers**

* e.g. `"1,2,3,4,5,6,`*`...n"`*<br>

#### **Handle newline as well as commas between numbers**

* Numbers can be delimited by a comma, e.g. `"1,2,3"`
* Numbers can be delimited by a newline, e.g. `"1\n2\n3"`
* Numbers can be delimited by either a comma or a newline, e.g. `“1\n2,3”`
* Delimiters cannot appear more than one in a row, e.g. `1\n,2`

#### **Support custom delimiters**

* To set the delimiter, the beginning of the string should contain a separate line using this format: `“//[delimiter]\n[numbers]”` e.g. `“//*\n1*2”`
* Delimiters can be of any length, e.g. `“//***\n1***2***3”`
* The first line is optional, so all existing scenarios must still be supported.

#### **Throw an exception when passed a negative number**

* Passing a negative number will throw an exception with the message “Sorry, I'm not feeling very positive about this input: -n” where n is the negative number passed int.&#x20;
* If there are multiple negative numbers, show all of them in the exception message.

#### **Numbers greater than 1000 are reset to 0**

* e.g. `"2,1001"` returns 3
* e.g. `"2,999"` returns 1

#### **Support multiple custom delimiters**

* Custom delimiters can be delimited using this format: `“//[delimiter1]/[delimiter2]\n[numbers]”`  e.g. `“//*/%\n1*2%3”`
