我有一個應用程序單個數字十進制EditText
。我想在從1到120點之前過濾數字。我想讓用戶在點之後輸入一個數字。 例如:用戶可以輸入1,23,23,45.7,89.6,119.9,120.0等。 用戶不能輸入3.34,45.76,89.652,120.00,121.00等。 我該如何做到這一點?請給我寫濾波器EditText
的工作對我而言)如何限制數字前後的數字點數EditText
0
A
回答
0
可以在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,
}
});
更新的onTextChanged
方法實現邏輯 對於開始的時候你可以使用這樣的事情:
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;
}
}
}
}
});
但是你也應該控制「。」的重複項。符號或其他東西。
更新#2 對於值可以使用,例如,代碼:
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();
}
}
但你應該隨身攜帶正確的值輸入。並考慮每個數字NumberPicker
或Spinner
。
1
mEditText.setFilters(new InputFilter[]{new DigitsInputFilter(maxDigitsBeforeDot, maxDigitsAfterDot, maxValue)});
如果不想點之前或之後,以限制數字只是把Integer.MAX_VALUE
,以禁用最大值限制使用Double.POSITIVE_INFINITY
。
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();
}
}
相關問題
- 1. 如何限制EditText框輸入小數點後兩個字符?
- 2. 限制使用小數點前的整數數字。數字
- 3. 限期後的數字EditText Android
- 4. Edittext如何只能接受小數點後的兩個數字
- 5. android edittext限制文本和數字
- 6. Android如何在EditText上設置最大「字數」限制
- 7. 如何在小數點後限制爲除0之外的數字
- 8. 如何在python隨機數限制小數點後的位數
- 9. 限制小數點後的位數
- 10. 限制UITextField中小數點前後的位數
- 11. 如何限制crm中的整數字段中的數字
- 12. 限制爲數字位數
- 13. 如何限制十進制數字 - Android
- 14. 如何限制輸入的字符數
- 15. 如何限制summernote中textarea的字數
- 16. 如何限制@ Html.TextArea中的字符數?
- 17. 我希望小數點前的數字的字號大於小數點後的數字
- 18. 如何輸入字段限制爲數字只能用兩個小數點
- 19. 從EditText到浮點數的字符串
- 20. EditText輸入限制500字?
- 21. C#如何將數字輸入限制爲一個數字
- 22. textarea中的字數限制
- 23. 如何限制此等式的最後一個字符串中的小數點
- 24. TFS:如何限制字段整數值
- 25. 如何使小數位的edittext字段
- 26. 如何設置EditText的數字格式
- 27. Edittext - 作爲屏幕大小的函數的字符數限制。可能嗎?
- 28. 如何限制在警報對話框中輸入的字符數EditText
- 29. 限制小數點後的位數在HTML5型(Angularjs模型)=「號」輸入字段
- 30. 導軌形式:如何限制輸入字段中的字符數(數字)
你可以給我我需要的過濾器代碼。我是Android編程新手 –
查看更新回答 –
謝謝,但我如何使用代碼過濾小數點前的數字?附:看到我更新的問題:http://stackoverflow.com/questions/40210803/how-to-combine-input-fiters-for-numberdecimal-edittext –