mirror of
https://github.com/CatimaLoyalty/Android.git
synced 2026-04-02 06:42:47 -04:00
Fixes to currency parsing
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user