Created
January 25, 2022 08:45
-
-
Save nguyenlinhnttu/badddc4ce1ee2499bba41cb8061e496b to your computer and use it in GitHub Desktop.
CustomTextWatcher format value
This file contains hidden or 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
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