Skip to content

Instantly share code, notes, and snippets.

@rafaelneiva
Created June 11, 2018 19:57
Show Gist options
  • Save rafaelneiva/7093c7f1b60d48af00b7ceac52c5c769 to your computer and use it in GitHub Desktop.
Save rafaelneiva/7093c7f1b60d48af00b7ceac52c5c769 to your computer and use it in GitHub Desktop.
Apply money mask with TextWatcher
public static class MoneyTextWatcher implements TextWatcher {
private final WeakReference<EditText> editTextWeakReference;
private NumberFormat mNF = NumberFormat.getCurrencyInstance(new Locale("pt", "BR"));
private boolean updating;
private boolean deleting;
public MoneyTextWatcher(EditText editText) {
editTextWeakReference = new WeakReference<>(editText);
//detect delete
editTextWeakReference.get().setOnKeyListener((v, keyCode, event) -> {
deleting = event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_DEL;
return false;
});
}
@Override
public void beforeTextChanged(CharSequence cs, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence cs, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable editable) {
if (updating) {
return;
}
updating = true;
applyMask(editable, editTextWeakReference.get());
updating = false;
}
private void applyMask(Editable editable, EditText editText) {
if (TextUtils.isEmpty(editable)) {
return;
}
int cursorPosition = editText.getSelectionStart();
//remove input filters to ignore input type
InputFilter[] filters = editable.getFilters();
editable.setFilters(new InputFilter[0]);
String cleanString = editable.toString().replaceAll("[R$,. ]", "");
BigDecimal parsed = new BigDecimal(cleanString).setScale(2, BigDecimal.ROUND_FLOOR).divide(new BigDecimal(100), BigDecimal.ROUND_FLOOR);
String formatted = mNF.format(parsed);
editable.clear();
editable.append(formatted);
//reset filters
editable.setFilters(filters);
int currentTextLen = editable.length();
//check if deleting
if (deleting && cursorPosition < currentTextLen) {
editText.setSelection(formatted.length());
deleting = false;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment