Created
June 11, 2018 19:57
-
-
Save rafaelneiva/7093c7f1b60d48af00b7ceac52c5c769 to your computer and use it in GitHub Desktop.
Apply money mask with TextWatcher
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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