Giống như những người khác đã nói, tôi đã thêm lớp này trong dự án của mình và đặt bộ lọc thành EditText
tôi muốn.
Bộ lọc được sao chép từ câu trả lời của @ Pixel. Tôi chỉ cần đặt tất cả lại với nhau.
public class DecimalDigitsInputFilter implements InputFilter {
Pattern mPattern;
public DecimalDigitsInputFilter() {
mPattern = Pattern.compile("([1-9]{1}[0-9]{0,2}([0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)");
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
String formatedSource = source.subSequence(start, end).toString();
String destPrefix = dest.subSequence(0, dstart).toString();
String destSuffix = dest.subSequence(dend, dest.length()).toString();
String result = destPrefix + formatedSource + destSuffix;
result = result.replace(",", ".");
Matcher matcher = mPattern.matcher(result);
if (matcher.matches()) {
return null;
}
return "";
}
}
Bây giờ đặt bộ lọc trong của bạn EditText
như thế này.
mEditText.setFilters(new InputFilter[]{new DecimalDigitsInputFilter()});
Ở đây, một điều quan trọng là nó giải quyết vấn đề của tôi là không cho phép hiển thị nhiều hơn hai chữ số sau dấu thập phân trong đó EditText
nhưng vấn đề là khi tôi getText()
từ đó EditText
, nó trả về toàn bộ đầu vào tôi đã nhập.
Ví dụ: sau khi áp dụng bộ lọc qua EditText
, tôi đã thử đặt đầu vào 1.5699856987. Vì vậy, trong màn hình, nó hiển thị 1.56 là hoàn hảo.
Sau đó, tôi muốn sử dụng đầu vào này cho một số tính toán khác vì vậy tôi muốn lấy văn bản từ trường đầu vào đó ( EditText
). Khi tôi gọimEditText.getText().toString()
nó trả về 1.5699856987 không được chấp nhận trong trường hợp của tôi.
Vì vậy, tôi đã phải phân tích giá trị một lần nữa sau khi nhận được nó từ EditText
.
BigDecimal amount = new BigDecimal(Double.parseDouble(mEditText.getText().toString().trim()))
.setScale(2, RoundingMode.HALF_UP);
setScale
thực hiện các mẹo ở đây sau khi nhận được toàn văn từ EditText
.