From 688010cae4e6178f530b05b1b0214b3e0479e401 Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Sun, 24 Jul 2022 15:13:21 +0200 Subject: [PATCH] Fixes to currency parsing --- .../card_locker/LoyaltyCardEditActivity.java | 6 +- .../main/java/protect/card_locker/Utils.java | 32 ++---- .../java/protect/card_locker/UtilsTest.java | 98 ------------------- 3 files changed, 13 insertions(+), 123 deletions(-) delete mode 100644 app/src/test/java/protect/card_locker/UtilsTest.java diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java index d10343326..13d1e82e4 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java @@ -52,6 +52,7 @@ import java.io.IOException; import java.io.InvalidObjectException; import java.math.BigDecimal; import java.text.DateFormat; +import java.text.ParseException; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; @@ -402,11 +403,10 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { try { - BigDecimal balance = Utils.parseCurrency(s.toString(), Utils.currencyHasDecimals(tempLoyaltyCard.balanceType)); + BigDecimal balance = Utils.parseBalance(s.toString(), tempLoyaltyCard.balanceType); updateTempState(LoyaltyCardField.balance, balance); validBalance = true; - - } catch (NumberFormatException e) { + } catch (ParseException e) { validBalance = false; e.printStackTrace(); } diff --git a/app/src/main/java/protect/card_locker/Utils.java b/app/src/main/java/protect/card_locker/Utils.java index 43175783d..60a8964e2 100644 --- a/app/src/main/java/protect/card_locker/Utils.java +++ b/app/src/main/java/protect/card_locker/Utils.java @@ -37,6 +37,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.math.BigDecimal; import java.text.NumberFormat; +import java.text.ParseException; import java.util.Calendar; import java.util.Currency; import java.util.Date; @@ -239,32 +240,19 @@ public class Utils { return numberFormat.format(value); } - static public Boolean currencyHasDecimals(Currency currency) { + static public BigDecimal parseBalance(String value, Currency currency) throws ParseException { + NumberFormat numberFormat = NumberFormat.getInstance(); + if (currency == null) { - return false; + numberFormat.setMaximumFractionDigits(0); + } else { + numberFormat.setMinimumFractionDigits(currency.getDefaultFractionDigits()); + numberFormat.setMaximumFractionDigits(currency.getDefaultFractionDigits()); } - return currency.getDefaultFractionDigits() != 0; - } + Log.d(TAG, numberFormat.parse(value).toString()); - static public BigDecimal parseCurrency(String value, Boolean hasDecimals) throws NumberFormatException { - // If there are no decimals expected, remove all separators before parsing - if (!hasDecimals) { - value = value.replaceAll("[^0-9]", ""); - return new BigDecimal(value); - } - - // There are many ways users can write a currency, so we fix it up a bit - // 1. Replace all non-numbers with dots - value = value.replaceAll("[^0-9]", "."); - - // 2. Remove all but the last dot - while (value.split("\\.").length > 2) { - value = value.replaceFirst("\\.", ""); - } - - // Parse as BigDecimal - return new BigDecimal(value); + return new BigDecimal(numberFormat.parse(value).toString()); } static public byte[] bitmapToByteArray(Bitmap bitmap) { diff --git a/app/src/test/java/protect/card_locker/UtilsTest.java b/app/src/test/java/protect/card_locker/UtilsTest.java deleted file mode 100644 index 9db9a4bcc..000000000 --- a/app/src/test/java/protect/card_locker/UtilsTest.java +++ /dev/null @@ -1,98 +0,0 @@ -package protect.card_locker; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.annotation.Config; - -import java.math.BigDecimal; -import java.util.Currency; - -import static org.junit.Assert.assertEquals; - -@RunWith(RobolectricTestRunner.class) -@Config(sdk = 23) -public class UtilsTest { - @Test - public void parseBalances() { - assertEquals("1", Utils.parseCurrency("1", false).toPlainString()); - - assertEquals("1", Utils.parseCurrency("1", true).toPlainString()); - assertEquals("1.00", Utils.parseCurrency("1.00", true).toPlainString()); - assertEquals("1.00", Utils.parseCurrency("1,00", true).toPlainString()); - assertEquals("1.00", Utils.parseCurrency("1 00", true).toPlainString()); - - assertEquals("25", Utils.parseCurrency("2.5", false).toPlainString()); - assertEquals("25", Utils.parseCurrency("2,5", false).toPlainString()); - assertEquals("25", Utils.parseCurrency("2 5", false).toPlainString()); - assertEquals("205", Utils.parseCurrency("2.05", false).toPlainString()); - assertEquals("205", Utils.parseCurrency("2,05", false).toPlainString()); - assertEquals("205", Utils.parseCurrency("2 05", false).toPlainString()); - - assertEquals("2.5", Utils.parseCurrency("2.5", true).toPlainString()); - assertEquals("2.5", Utils.parseCurrency("2,5", true).toPlainString()); - assertEquals("2.5", Utils.parseCurrency("2 5", true).toPlainString()); - assertEquals("2.05", Utils.parseCurrency("2.05", true).toPlainString()); - assertEquals("2.05", Utils.parseCurrency("2,05", true).toPlainString()); - assertEquals("2.05", Utils.parseCurrency("2 05", true).toPlainString()); - assertEquals("2.50", Utils.parseCurrency("2.50", true).toPlainString()); - assertEquals("2.50", Utils.parseCurrency("2,50", true).toPlainString()); - assertEquals("2.50", Utils.parseCurrency("2 50", true).toPlainString()); - - assertEquals("995", Utils.parseCurrency("9.95", false).toPlainString()); - assertEquals("995", Utils.parseCurrency("9,95", false).toPlainString()); - assertEquals("995", Utils.parseCurrency("9 95", false).toPlainString()); - - assertEquals("9.95", Utils.parseCurrency("9.95", true).toPlainString()); - assertEquals("9.95", Utils.parseCurrency("9,95", true).toPlainString()); - assertEquals("9.95", Utils.parseCurrency("9 95", true).toPlainString()); - - assertEquals("1234", Utils.parseCurrency("1234", false).toPlainString()); - assertEquals("1234", Utils.parseCurrency("1.234", false).toPlainString()); - assertEquals("1234", Utils.parseCurrency("1,234", false).toPlainString()); - assertEquals("1234", Utils.parseCurrency("1 234", false).toPlainString()); - - assertEquals("1234", Utils.parseCurrency("1234", true).toPlainString()); - assertEquals("1234.00", Utils.parseCurrency("1234.00", true).toPlainString()); - assertEquals("1234.00", Utils.parseCurrency("1.234.00", true).toPlainString()); - assertEquals("1234.00", Utils.parseCurrency("1.234,00", true).toPlainString()); - assertEquals("1234.00", Utils.parseCurrency("1,234.00", true).toPlainString()); - assertEquals("1234.00", Utils.parseCurrency("1,234,00", true).toPlainString()); - assertEquals("1234.00", Utils.parseCurrency("1 234,00", true).toPlainString()); - assertEquals("1234.00", Utils.parseCurrency("1 234,00", true).toPlainString()); - assertEquals("1234.00", Utils.parseCurrency("1 234 00", true).toPlainString()); - - } - - @Test - public void formatBalances() { - Currency euro = Currency.getInstance("EUR"); - - assertEquals("1", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("1"), null)); - assertEquals("1.00", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("1"), euro)); - - assertEquals("25", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("25"), null)); - assertEquals("25.00", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("25"), euro)); - - assertEquals("2", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("2.5"), null)); - assertEquals("2.50", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("2.5"), euro)); - - assertEquals("2", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("2.05"), null)); - assertEquals("2.05", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("2.05"), euro)); - - assertEquals("2", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("2.50"), null)); - assertEquals("2.50", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("2.50"), euro)); - - assertEquals("995", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("995"), null)); - assertEquals("995.00", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("995"), euro)); - - assertEquals("10", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("9.95"), null)); - assertEquals("9.95", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("9.95"), euro)); - - assertEquals("1,234", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("1234"), null)); - assertEquals("1,234.00", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("1234"), euro)); - - assertEquals("1,234", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("1234.00"), null)); - assertEquals("1,234.00", Utils.formatBalanceWithoutCurrencySymbol(new BigDecimal("1234.00"), euro)); - } -}