diff --git a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/csvimport/AmountParser.java b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/csvimport/AmountParser.java index 4b3ef7fdbf91c122a789129211d7536ac22edab4..11a00e245f8fba7511cc048cb4b163798bf83488 100644 --- a/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/csvimport/AmountParser.java +++ b/BudgetMasterServer/src/main/java/de/deadlocker8/budgetmaster/transactions/csvimport/AmountParser.java @@ -1,9 +1,8 @@ package de.deadlocker8.budgetmaster.transactions.csvimport; -import java.text.DecimalFormat; -import java.text.DecimalFormatSymbols; -import java.text.MessageFormat; -import java.text.ParseException; +import org.springframework.security.core.parameters.P; + +import java.text.*; import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -35,7 +34,7 @@ public class AmountParser final String amount = matcher.group(2); - final DecimalFormat decimalFormat = new DecimalFormat(); + final DecimalFormat decimalFormat = new DecimalFormat("#,###.#"); final DecimalFormatSymbols symbols = new DecimalFormatSymbols(); symbols.setDecimalSeparator(decimalSeparator); symbols.setGroupingSeparator(groupingSeparator); @@ -43,9 +42,15 @@ public class AmountParser decimalFormat.setDecimalFormatSymbols(symbols); final String parseableString = MessageFormat.format("{0}{1}", sign, amount); + final ParsePosition parsePosition = new ParsePosition(0); try { - final double parseDouble = decimalFormat.parse(parseableString).doubleValue(); + final double parseDouble = decimalFormat.parse(parseableString, parsePosition).doubleValue(); + if(parsePosition.getIndex() != parseableString.length()) + { + throw new ParseException("String not fully parsed", parsePosition.getIndex()); + } + return Optional.of((int) (parseDouble * 100)); } catch(ParseException e) diff --git a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/transaction/csvimport/AmountParserTest.java b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/transaction/csvimport/AmountParserTest.java index ed074cb52890bfbe2cf9eb9a66a2ff4f8d545ed4..3f64af30a1b90f7e5aa3132b6bd5533a4be1a224 100644 --- a/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/transaction/csvimport/AmountParserTest.java +++ b/BudgetMasterServer/src/test/java/de/deadlocker8/budgetmaster/unit/transaction/csvimport/AmountParserTest.java @@ -246,6 +246,21 @@ class AmountParserTest .get().isEqualTo(-123403); } + @Test + void test_thousandsDelimiter_specialDelimiter_invalid() + { + assertThat(AmountParser.parse("-234.03 €", 'e', 't')) + .isEmpty(); + } + + @Test + void test_thousandsDelimiter_specialDelimiter_valid() + { + assertThat(AmountParser.parse("-1t234e03 €", 'e', 't')) + .isPresent() + .get().isEqualTo(-123403); + } + @Test void test_thousandsDelimiter_bigNumber() {