У меня проблемы с применением денежной маски, результат суммы неверен, и если я ввожу другое значение в другое поле, приложение закрывается, в основном я хочу вычислить значения 4 полей, но я могу толькорассчитать значения полей 1 и 2, или 3 и 4 и т. д. (https://i.ibb.co/6tfSZHs/Screenshot-20191003-213827-teste-Double.jpg)
public class MainActivity extends AppCompatActivity {
EditText edtOne, edtTwo, edtThree, edtFour;
TextView tvResult;
DecimalFormat currency = new DecimalFormat("$###,###.##");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Locale mLocale = new Locale("pt", "BR");
edtOne = findViewById(R.id.v1);
edtTwo = findViewById(R.id.v2);
edtThree = findViewById(R.id.v3);
edtFour = findViewById(R.id.v4);
tvResult = findViewById(R.id.resultado);
edtOne.addTextChangedListener(new MoneyTextWatcher(edtOne, mLocale));
edtOne.addTextChangedListener(new MoneyTextWatcher(edtOne, mLocale));
edtTwo.addTextChangedListener(new MoneyTextWatcher(edtTwo, mLocale));
edtThree.addTextChangedListener(new MoneyTextWatcher(edtThree, mLocale));
edtFour.addTextChangedListener(new MoneyTextWatcher(edtFour, mLocale));
}
public class MoneyTextWatcher implements TextWatcher {
private final WeakReference<EditText> editTextWeakReference;
private final Locale locale;
public MoneyTextWatcher(EditText editText, Locale locale) {
this.editTextWeakReference = new WeakReference<EditText>(editText);
this.locale = locale != null ? locale : Locale.getDefault();
}
public MoneyTextWatcher(EditText editText) {
this.editTextWeakReference = new WeakReference<EditText>(editText);
this.locale = Locale.getDefault();
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int i, int i1, int i2) {
if (!TextUtils.isEmpty(edtOne.getText().toString().trim())
|| !TextUtils.isEmpty(edtTwo.getText().toString().trim())
|| !TextUtils.isEmpty(edtThree.getText().toString().trim())
|| !TextUtils.isEmpty(edtFour.getText().toString().trim())
) {
Double firtValue = Double.valueOf(String.valueOf(TextUtils.isEmpty(edtOne.getText().toString().trim()) ? 0 : (edtOne.getText().toString().trim())));
Double secondValue = Double.valueOf(String.valueOf(TextUtils.isEmpty(edtTwo.getText().toString().trim()) ? 0 : (edtTwo.getText().toString().trim())));
Double thirdValue = Double.valueOf(String.valueOf(TextUtils.isEmpty(edtThree.getText().toString().trim()) ? 0 : edtThree.getText().toString().trim()));
Double forthValue = Double.valueOf(String.valueOf(TextUtils.isEmpty(edtFour.getText().toString().trim()) ? 0 : (edtFour.getText().toString().trim())));
double answer = firtValue + secondValue + thirdValue + forthValue;
Log.e("RESULT", String.valueOf(answer));
tvResult.setText(String.format("Total: $" + "%,.2f", (answer)));
} else {
tvResult.setText("");
}
}
@Override
public void afterTextChanged(Editable editable) {
EditText editText = editTextWeakReference.get();
if (editText == null) return;
editText.removeTextChangedListener(this);
BigDecimal parsed = parseToBigDecimal(editable.toString(), locale);
String formatted = NumberFormat.getCurrencyInstance(locale).format(parsed);
editText.setText(formatted);
editText.setSelection(formatted.length());
editText.addTextChangedListener(this);
}
public BigDecimal parseToBigDecimal(String value, Locale locale) {
String replaceable = String.format("[%s,.\\s]", NumberFormat.getCurrencyInstance(locale).getCurrency().getSymbol());
String cleanString = value.replaceAll(replaceable, "");
return new BigDecimal(cleanString).setScale(
2, BigDecimal.ROUND_FLOOR).divide(new BigDecimal(100), BigDecimal.ROUND_FLOOR
);
}
}
}
Я бы хотел, чтобы конечный результат был точно суммой полей.