diff --git a/README.md b/README.md
index c8bbb25a527da9ed97b85c3c72ba5757d7a75ed1..2fa755e8dbac14b2fdaf3108cfbe4364b3b6f382 100644
--- a/README.md
+++ b/README.md
@@ -23,3 +23,7 @@ Ce dépôt Git a pour but de partager les différents ateliers pouvant être ré
     * Niveau: Débutant
     * Lien: [Roman Numerals avec Julie et Colin](https://www.youtube.com/watch?v=CWJqq_k7hDY)
     * Go To: [RomanNumerals](/romanNumerals)
+* **[Presque String Calculator](https://codingdojo.org/kata/StringCalculator/)**: Par Marina FILLATRE et Colin DAMON le 23/07/2020
+    * Niveau: Moyen
+    * Lien: [Agility && TDD, Marina et Colin](https://www.twitch.tv/videos/688222419)
+    * Go To: [stringCalculator](/stringCalculator)
diff --git a/stringCalculator/src/main/java/fr/ippon/stringcalculator/Calculator.java b/stringCalculator/src/main/java/fr/ippon/stringcalculator/Calculator.java
new file mode 100644
index 0000000000000000000000000000000000000000..792c5707c393b9d0fd716b79ca7b8cf640aa2736
--- /dev/null
+++ b/stringCalculator/src/main/java/fr/ippon/stringcalculator/Calculator.java
@@ -0,0 +1,41 @@
+package fr.ippon.stringcalculator;
+
+import java.math.BigDecimal;
+import java.util.function.BinaryOperator;
+
+public class Calculator {
+
+  public static String sum(String first, String second) {
+    return operate(first, second, BigDecimal::add);
+  }
+
+  public static String substract(String first,
+      String second) {
+    return operate(first, second, BigDecimal::subtract);
+  }
+
+  private static String operate(String first,
+      String second, BinaryOperator<BigDecimal> operation) {
+    notNull(first);
+    notNull(second);
+
+    return operation
+        .apply(toBigDecimal(first), toBigDecimal(second))
+        .toPlainString();
+  }
+
+  private static BigDecimal toBigDecimal(String value) {
+    if (value.isBlank()) {
+      return BigDecimal.ZERO;
+    }
+
+    return new BigDecimal(value.replace(",", "."));
+  }
+
+  private static void notNull(String first) {
+    if (first == null) {
+      throw new IllegalArgumentException();
+    }
+  }
+
+}
diff --git a/stringCalculator/src/test/java/fr/ippon/stringcalculator/CalculatorTest.java b/stringCalculator/src/test/java/fr/ippon/stringcalculator/CalculatorTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..1b4d1668928f07e6611230468d61e6558e2ee073
--- /dev/null
+++ b/stringCalculator/src/test/java/fr/ippon/stringcalculator/CalculatorTest.java
@@ -0,0 +1,89 @@
+package fr.ippon.stringcalculator;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.Test;
+
+public class CalculatorTest {
+
+  @Test
+  void shouldNotSumWithNullFirstInput() {
+    assertThatThrownBy(() -> Calculator.sum(null, "3"))
+        .isExactlyInstanceOf(
+            IllegalArgumentException.class);
+  }
+
+  @Test
+  void shouldNotSumWithNullSecondInput() {
+    assertThatThrownBy(() -> Calculator.sum("3", null))
+        .isExactlyInstanceOf(
+            IllegalArgumentException.class);
+  }
+
+  @Test
+  void shouldSumEmptyInputs() {
+    assertThat(Calculator.sum("", "")).isEqualTo("0");
+  }
+
+  @Test
+  void shouldSumIntegerWithEmptyFirstInput() {
+    assertThat(Calculator.sum("", "4")).isEqualTo("4");
+  }
+
+  @Test
+  void shouldSumIntegerWithEmptySecondInput() {
+    assertThat(Calculator.sum("4", "")).isEqualTo("4");
+  }
+
+  @Test
+  void shouldSumIntegers() {
+    assertThat(Calculator.sum("1", "2")).isEqualTo("3");
+  }
+
+  @Test
+  void shouldSumFloats() {
+    assertThat(Calculator.sum("1.01", "2.02"))
+        .isEqualTo("3.03");
+  }
+
+  @Test
+  void shouldSumCommaSeparatedFloats() {
+    assertThat(Calculator.sum("1,01", "2,02"))
+        .isEqualTo("3.03");
+  }
+
+  @Test
+  void shouldSumNegativeCommaSeparatedFloats() {
+    assertThat(Calculator.sum("-1,01", "-2,02"))
+        .isEqualTo("-3.03");
+  }
+
+  @Test
+  void shouldNotSubstractNullInputs() {
+    assertThatThrownBy(
+        () -> Calculator.substract(null, "3"))
+            .isExactlyInstanceOf(
+                IllegalArgumentException.class);
+  }
+
+  @Test
+  void shouldNotSubstractWithNullSecondInputs() {
+    assertThatThrownBy(
+        () -> Calculator.substract("3", null))
+            .isExactlyInstanceOf(
+                IllegalArgumentException.class);
+  }
+
+  @Test
+  void shouldSubstractCommaSeparatedFloats() {
+    assertThat(Calculator.substract("1,01", "2,02"))
+        .isEqualTo("-1.01");
+  }
+
+  @Test
+  void shouldSumTooBigIntegers() {
+    assertThat(Calculator
+        .sum(String.valueOf(Integer.MAX_VALUE), "2,02"))
+            .isEqualTo("2147483649.02");
+  }
+}