Ich habe eine App mit single numberdecimal EditText
. Ich möchte Ziffern vor dem Punkt von 1 bis 120 filtern. Und ich möchte dem Benutzer erlauben, eine Ziffer nach dem anderen einzugeben. Beispiel: Der Benutzer kann Eingang 1, 2,3, 23, 45,7, 89,6, 119,9, 120,0 usw. Benutzer können nicht eingegeben 3,34, 45,76, 89,652, 120.00, 121.00 usw. Wie kann ich diese Filter tun? Bitte schreiben Sie mir, dass die Arbeit Filter mit EditText
zu meinen Bedingungen)So begrenzen Sie die Ziffern vor und nach dem Punkt in der Zahl Dezimal EditText
0
A
Antwort
0
Sie können Ihre Logik in onTextChanged
Methode von TextWatcher
editText.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start,
}
});
-Update implementieren Für Anfang Sie etwas wie folgt verwenden können:
editText.addTextChangedListener(new TextWatcher() {
boolean ignoreChange = false;
@Override
public void afterTextChanged(Editable s) {}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
if (!ignoreChange) {
String string = charSequence.toString();
String[] parts = string.split("\\.");
if (parts.length > 1) {
String digitsAfterPoint = parts[1];
if (digitsAfterPoint.length() > 1) {
ignoreChange = true;
editText.setText(string.substring(0, string.indexOf(".") + 2));
editText.setSelection(editText.getText().length());
ignoreChange = false;
}
}
}
}
});
Aber Sie sollten auch Duplikate von "." Symbol oder etwas anderes.
Update # 2 Für Wert können Sie verwenden, zum Beispiel, dass Code:
editText.addTextChangedListener(new TextWatcher() {
boolean ignoreChange = false;
String beforeChange;
@Override
public void afterTextChanged(Editable s) {}
@Override
public void beforeTextChanged(CharSequence charSequence, int start,
int count, int after) {
}
@Override
public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
if (!ignoreChange) {
String string = charSequence.toString();
String[] parts = string.split("\\.");
if (parts.length > 1) {
String digitsAfterPoint = parts[1];
if (digitsAfterPoint.length() > 1) {
ignoreChange = true;
editText.setText(string.substring(0, string.indexOf(".") + 2));
editText.setSelection(editText.getText().length());
ignoreChange = false;
}
}
String strValue = editText.getText().toString();
float value = Float.valueOf(strValue);
if (value < 1 || value > 120) {
ignoreChange = true;
editText.setText(beforeChange);
editText.setSelection(editText.getText().length());
ignoreChange = false;
}
beforeChange = editText.getText().toString();
}
}
Aber Sie sollten über korrekte Werte Eingabe tragen. Und denken Sie an NumberPicker
oder Spinner
für jede Ziffer.
1
mEditText.setFilters(new InputFilter[]{new DigitsInputFilter(maxDigitsBeforeDot, maxDigitsAfterDot, maxValue)});
Wenn Sie wollen keine Stellen vor oder nach dem Punkt nur Integer.MAX_VALUE
, disable auf Grenze MaximalwertDouble.POSITIVE_INFINITY
Gebrauch genommen zu begrenzen.
public class DigitsInputFilter implements InputFilter {
private final String DOT = ".";
private int mMaxIntegerDigitsLength;
private int mMaxDigitsAfterLength;
private double mMax;
public DigitsInputFilter(int maxDigitsBeforeDot, int maxDigitsAfterDot, double maxValue) {
mMaxIntegerDigitsLength = maxDigitsBeforeDot;
mMaxDigitsAfterLength = maxDigitsAfterDot;
mMax = maxValue;
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
String allText = getAllText(source, dest, dstart);
String onlyDigitsText = getOnlyDigitsPart(allText);
if (allText.isEmpty()) {
return null;
} else {
double enteredValue;
try {
enteredValue = Double.parseDouble(onlyDigitsText);
} catch (NumberFormatException e) {
return "";
}
return checkMaxValueRule(enteredValue, onlyDigitsText);
}
}
private CharSequence checkMaxValueRule(double enteredValue, String onlyDigitsText) {
if (enteredValue > mMax) {
return "";
} else {
return handleInputRules(onlyDigitsText);
}
}
private CharSequence handleInputRules(String onlyDigitsText) {
if (isDecimalDigit(onlyDigitsText)) {
return checkRuleForDecimalDigits(onlyDigitsText);
} else {
return checkRuleForIntegerDigits(onlyDigitsText.length());
}
}
private boolean isDecimalDigit(String onlyDigitsText) {
return onlyDigitsText.contains(DOT);
}
private CharSequence checkRuleForDecimalDigits(String onlyDigitsPart) {
String afterDotPart = onlyDigitsPart.substring(onlyDigitsPart.indexOf(DOT), onlyDigitsPart.length() - 1);
if (afterDotPart.length() > mMaxDigitsAfterLength) {
return "";
}
return null;
}
private CharSequence checkRuleForIntegerDigits(int allTextLength) {
if (allTextLength > mMaxIntegerDigitsLength) {
return "";
}
return null;
}
private String getOnlyDigitsPart(String text) {
return text.replaceAll("[^0-9?!\\.]", "");
}
private String getAllText(CharSequence source, Spanned dest, int dstart) {
String allText = "";
if (!dest.toString().isEmpty()) {
if (source.toString().isEmpty()) {
allText = deleteCharAtIndex(dest, dstart);
} else {
allText = new StringBuilder(dest).insert(dstart, source).toString();
}
}
return allText;
}
private String deleteCharAtIndex(Spanned dest, int dstart) {
StringBuilder builder = new StringBuilder(dest);
builder.deleteCharAt(dstart);
return builder.toString();
}
}
Verwandte Themen
- 1. Begrenzen Ziffern nach Zeitraum EditText Android
- 2. Nur erste Zahl vor dem Punkt Zeichen
- 3. nur zwei Ziffern nach dem Dezimal asp.net
- 4. Begrenzen Sie die Zahlen vor und nach dem Dezimalpunkt auf der Eingangsnummer
- 5. Python: Der schnellste Weg, um zwei Ziffern nach dem Punkt zu berechnen (Float, Dezimal oder etwas anderes)?
- 6. feste Anzahl von Nullen vor und nach dem Dezimal in Sybase setzen
- 7. den Raum vor und nach der Zahl
- 8. Legen Sie die Anzahl der Ziffern nach dem Punkt in Doppel
- 9. Trim alle Nullstellen vor und nach dem Dezimal Regex
- 10. Verfolgen der Ziffern vor dem Operatorzeichen
- 11. Dezimal wird in Ziffern
- 12. Regex Muster erlaubt Dezimal nach 4 Ziffern
- 13. Suchen Sie nach der N-ten Zahl nur geradzahliger Ziffern.
- 14. So zeigen Sie die ersten 12 Ziffern des Sternchens und die letzten 4 Ziffern an
- 15. Wie erhalten Sie die letzten 3 Ziffern nach dem Komma?
- 16. So ermitteln Sie, ob die Zahl Ziffern in aufsteigender Reihenfolge von rechts nach links hat
- 17. Hinzufügen von Dezimal nach der ganzen Zahl in Lua
- 18. So trennen Sie eine ganze Zahl in Ziffern
- 19. Doppelt nach Dezimal ohne Rundung nach 15 Ziffern
- 20. So löschen Sie alle Zahlen nach dem Punkt in PHP
- 21. Fließkomma mit 2 Ziffern nach Punkt
- 22. So extrahieren Sie die Zahl mit Dezimal in Hive mit regexp_extract
- 23. erhalten Wert vor Punkt und nach Punkt mit jquery
- 24. JavaScript; Runde, ändert Punkt auf Komma, und stellen Sie Punkt nach drei Ziffern
- 25. Wie die Größe der Zahl vor dem Dezimalpunkt in Angularjs zu beheben?
- 26. Regex begrenzen Ziffern zu wiederholen
- 27. Begrenzen Sie die Anzahl der Texte im Editiertext auf 13 Ziffern android
- 28. Vereinfachen Sie den regulären Ausdruck dezimal mit Punkt
- 29. Begrenzen Sie die Länge der Textview
- 30. Summe der Ziffern einer Zahl in Mysql
können Sie mir Code für Filter geben, die ich brauche. Ich bin neu in Android-Programmierung –
Siehe aktualisierte Antwort –
danke, aber wie kann ich Nummer vor dem Komma mit Ihrem Code filtern? P.S. Siehe meine aktualisierte Frage: http://stackoverflow.com/questions/40210803/how-to-combine-input-fiters-for-numberdecimal-edittext –