Skip to content

Commit 772e15f

Browse files
committed
Unify parsing of amounts.
1 parent cbfb3cc commit 772e15f

3 files changed

Lines changed: 23 additions & 29 deletions

File tree

app/src/main/java/org/gnucash/android/ui/transaction/TransactionFormFragment.java

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,23 +1013,6 @@ public static String stripCurrencyFormatting(String s){
10131013
return stripped;
10141014
}
10151015

1016-
/**
1017-
* Parse an input string into a {@link BigDecimal}
1018-
* This method expects the amount including the decimal part
1019-
* @param amountString String with amount information
1020-
* @return BigDecimal with the amount parsed from <code>amountString</code>
1021-
*/
1022-
public static BigDecimal parseInputToDecimal(String amountString){
1023-
String clean = stripCurrencyFormatting(amountString);
1024-
if (clean.length() == 0) //empty string
1025-
return BigDecimal.ZERO;
1026-
//all amounts are input to 2 decimal places, so after removing decimal separator, divide by 100
1027-
//TODO: Handle currencies with different kinds of decimal places
1028-
return new BigDecimal(clean).setScale(2,
1029-
RoundingMode.HALF_EVEN).divide(new BigDecimal(100), 2,
1030-
RoundingMode.HALF_EVEN);
1031-
}
1032-
10331016
@Override
10341017
public void transferComplete(Money amount) {
10351018
mSplitQuantity = amount;

app/src/main/java/org/gnucash/android/ui/transaction/dialog/TransferFundsDialogFragment.java

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,14 @@
4040
import org.gnucash.android.model.Commodity;
4141
import org.gnucash.android.model.Money;
4242
import org.gnucash.android.model.Price;
43-
import org.gnucash.android.ui.transaction.TransactionFormFragment;
4443
import org.gnucash.android.ui.transaction.TransactionsActivity;
4544
import org.gnucash.android.ui.util.OnTransferFundsListener;
4645

4746
import java.math.BigDecimal;
4847
import java.text.DecimalFormat;
4948
import java.text.NumberFormat;
5049
import java.text.ParseException;
50+
import java.text.ParsePosition;
5151
import java.util.Currency;
5252

5353
import butterknife.Bind;
@@ -201,13 +201,10 @@ private void transferFunds() {
201201
String originCommodityUID = commoditiesDbAdapter.getCommodityUID(mOriginAmount.getCurrency().getCurrencyCode());
202202
String targetCommodityUID = commoditiesDbAdapter.getCommodityUID(mTargetCurrencyCode);
203203

204-
if (mExchangeRateRadioButton.isChecked()){
204+
if (mExchangeRateRadioButton.isChecked()) {
205205
BigDecimal rate;
206-
String exchangeRateString = mExchangeRateInput.getText().toString();
207-
DecimalFormat formatter = (DecimalFormat) NumberFormat.getNumberInstance();
208-
formatter.setParseBigDecimal(true);
209206
try {
210-
rate = (BigDecimal) formatter.parse(exchangeRateString);
207+
rate = parseAmount(mExchangeRateInput.getText().toString());
211208
} catch (ParseException e) {
212209
mExchangeRateInputLayout.setError(getString(R.string.error_invalid_exchange_rate));
213210
return;
@@ -218,14 +215,14 @@ private void transferFunds() {
218215
mConvertedAmount = mOriginAmount.multiply(rate).withCurrency(targetCommodity);
219216
}
220217

221-
if (mConvertedAmountRadioButton.isChecked()){
222-
String convertedAmount = mConvertedAmountInput.getText().toString();
223-
if (convertedAmount.isEmpty()){
224-
mConvertedAmountInputLayout.setError(getString(R.string.error_converted_amount_required));
218+
if (mConvertedAmountRadioButton.isChecked()) {
219+
BigDecimal amount;
220+
try {
221+
amount = parseAmount(mConvertedAmountInput.getText().toString());
222+
} catch (ParseException e) {
223+
mConvertedAmountInputLayout.setError(getString(R.string.error_invalid_amount));
225224
return;
226225
}
227-
228-
BigDecimal amount = TransactionFormFragment.parseInputToDecimal(convertedAmount);
229226
mConvertedAmount = new Money(amount, Commodity.getInstance(mTargetCurrencyCode));
230227

231228
price = new Price(originCommodityUID, targetCommodityUID);
@@ -243,6 +240,19 @@ private void transferFunds() {
243240
dismiss();
244241
}
245242

243+
private BigDecimal parseAmount(String amount) throws ParseException {
244+
DecimalFormat formatter = (DecimalFormat) NumberFormat.getNumberInstance();
245+
formatter.setParseBigDecimal(true);
246+
ParsePosition parsePosition = new ParsePosition(0);
247+
BigDecimal parsedAmount = (BigDecimal) formatter.parse(amount, parsePosition);
248+
249+
// Ensure any mistyping by the user is caught instead of partially parsed
250+
if (parsePosition.getIndex() < amount.length())
251+
throw new ParseException("Parse error", parsePosition.getErrorIndex());
252+
253+
return parsedAmount;
254+
}
255+
246256
/**
247257
* Hides the error message from mConvertedAmountInputLayout and mExchangeRateInputLayout
248258
* when the user edits their content.

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,7 @@
393393
<string name="menu_duplicate_transaction">Duplicate</string>
394394
<string name="error_invalid_exchange_rate">Invalid exchange rate</string>
395395
<string name="sample_exchange_rate">e.g. 1 %1$s = x.xx %2$s</string>
396+
<string name="error_invalid_amount">Invalid amount</string>
396397
<string-array name="report_time_range">
397398
<item>Current month</item>
398399
<item>Last 3 months</item>

0 commit comments

Comments
 (0)