Як говорили інші, я додав цей клас у свій проект і встановив фільтр на те, що EditText
я хочу.
Фільтр скопійовано з відповіді @ Pixel. Я просто все це складаю.
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 "";
}
}
Тепер встановіть фільтр у ваш EditText
подібний.
mEditText.setFilters(new InputFilter[]{new DecimalDigitsInputFilter()});
Ось одна важлива річ, це те, що вона вирішує мою проблему, не дозволяючи показувати більше двох цифр після десяткової крапки в цьому, EditText
але проблема полягає в тому, що коли я getText()
з цього EditText
, він повертає весь введений я введення.
Наприклад, застосувавши фільтр над EditText
, я спробував встановити вхід 1.5699856987. Так на екрані він показує 1,56, що ідеально.
Тоді я хотів використати цей вхід для деяких інших обчислень, тому хотів отримати текст із цього поля введення ( EditText
). Коли я зателефонувавmEditText.getText().toString()
він повертає 1,5699856987, що в моєму випадку не було прийнятним.
Тому мені довелося знову проаналізувати значення після отримання його з EditText
.
BigDecimal amount = new BigDecimal(Double.parseDouble(mEditText.getText().toString().trim()))
.setScale(2, RoundingMode.HALF_UP);
setScale
робить трюк тут після отримання повного тексту з EditText
.