Skip to content

Instantly share code, notes, and snippets.

@nguyenlinhnttu
Created January 25, 2022 08:45
Show Gist options
  • Save nguyenlinhnttu/badddc4ce1ee2499bba41cb8061e496b to your computer and use it in GitHub Desktop.
Save nguyenlinhnttu/badddc4ce1ee2499bba41cb8061e496b to your computer and use it in GitHub Desktop.
CustomTextWatcher format value
import android.text.TextWatcher;
import android.util.Log;
import android.widget.EditText;
import java.text.NumberFormat;
public class CustomTextWatcher implements TextWatcher {
private NumberFormat nf = NumberFormat.getNumberInstance();
private EditText mEditText;
private String tmp = "";
private int moveCaretTo;
private static final int INTEGER_CONSTRAINT = 3;
private int FRACTION_CONSTRAINT = 1;
private int MAX_LENGTH = INTEGER_CONSTRAINT
+ FRACTION_CONSTRAINT + 1;
public CustomTextWatcher(EditText mEditText, int number_fractor) {
this.mEditText = mEditText;
nf.setMaximumIntegerDigits(INTEGER_CONSTRAINT);
this.FRACTION_CONSTRAINT = number_fractor;
nf.setMaximumFractionDigits(number_fractor);
nf.setGroupingUsed(false);
}
public CustomTextWatcher(EditText mEditText) {
this.mEditText = mEditText;
nf.setMaximumIntegerDigits(INTEGER_CONSTRAINT);
nf.setMaximumFractionDigits(FRACTION_CONSTRAINT);
nf.setGroupingUsed(false);
}
private int countOccurrences(String str, char c) {
int count = 0;
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == c) {
count++;
}
}
return count;
}
@Override
public void afterTextChanged(Editable s) {
mEditText.removeTextChangedListener(this);
String ss = s.toString();
int len = ss.length();
int dots = countOccurrences(ss, '.');
boolean shouldParse = dots <= 1 && (dots == 0 ? len != (INTEGER_CONSTRAINT + 1) : len < (MAX_LENGTH + 1));
if (shouldParse) {
if (len > 1 && ss.lastIndexOf(".") != len - 1) {
try {
if (ss.contains(".")) {
String[] integerFractionStrings = ss.split("\\.");
Log.v("Full Text", ss);
Log.v("Length Before Dot: ", "Found" + integerFractionStrings.length);
if (integerFractionStrings.length > 1) {
Log.v("integerFractionStrings", integerFractionStrings[1]);
if (integerFractionStrings[1].length() == 1) {
mEditText.setText(ss);
} else {
//Check Length Before Dot : Temp = 2 Weight = 1
if (FRACTION_CONSTRAINT == integerFractionStrings[1].length()) {
mEditText.setText(ss);
} else {
mEditText.setText(ss.substring(0, ss.length() - 1));
}
}
}
} else {
Double d = Double.parseDouble(ss);
mEditText.setText(nf.format(d).replaceAll(",", "."));
}
} catch (NumberFormatException e) {
e.printStackTrace();
}
}
} else {
Log.v("second string", "size 1");
mEditText.setText(tmp);
}
mEditText.addTextChangedListener(this);
// tried to fix caret positioning after key type:
if (mEditText.getText().toString().length() > 0) {
if (dots == 0 && len >= INTEGER_CONSTRAINT
&& moveCaretTo > INTEGER_CONSTRAINT) {
moveCaretTo = INTEGER_CONSTRAINT;
} else if (dots > 0 && len >= (MAX_LENGTH)
&& moveCaretTo > (MAX_LENGTH)) {
moveCaretTo = MAX_LENGTH;
}
try {
mEditText.setSelection(mEditText.getText().toString().length());
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
moveCaretTo = mEditText.getSelectionEnd();
tmp = s.toString();
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
int length = mEditText.getText().toString().length();
if (length > 0) {
moveCaretTo = start + count - before;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment