Como outros disseram, eu adicionei essa classe no meu projeto e configurei o filtro para o que EditText
eu quero.
O filtro é copiado da resposta do @ Pixel. Estou apenas juntando tudo.
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 "";
}
}
Agora defina o filtro EditText
como você está.
mEditText.setFilters(new InputFilter[]{new DecimalDigitsInputFilter()});
Aqui, uma coisa importante é que resolve meu problema de não permitir mostrar mais de dois dígitos após o ponto decimal, EditText
mas o problema é getText()
que EditText
, a partir daí, ele retorna toda a entrada digitada.
Por exemplo, depois de aplicar o filtro sobre o EditText
, tentei definir a entrada 1.5699856987. Então, na tela, mostra 1,56, o que é perfeito.
Então, eu queria usar essa entrada para alguns outros cálculos, então queria obter o texto desse campo de entrada ( EditText
). Quando eu chamei mEditText.getText().toString()
, retorna 1.5699856987, o que não era aceitável no meu caso.
Então eu tive que analisar o valor novamente depois de obtê-lo do EditText
.
BigDecimal amount = new BigDecimal(Double.parseDouble(mEditText.getText().toString().trim()))
.setScale(2, RoundingMode.HALF_UP);
setScale
faz o truque aqui depois de obter o texto completo do EditText
.