Como dijeron otros, agregué esta clase en mi proyecto y configuré el filtro como EditText
quiero.
El filtro se copia de la respuesta de @ Pixel. Solo lo estoy poniendo todo junto.
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 "";
}
}
Ahora configure el filtro en su EditText
como este.
mEditText.setFilters(new InputFilter[]{new DecimalDigitsInputFilter()});
Aquí, una cosa importante es que resuelve mi problema de no permitir mostrar más de dos dígitos después del punto decimal en eso, EditText
pero el problema es que cuando getText()
de eso EditText
, devuelve toda la entrada que escribí.
Por ejemplo, después de aplicar el filtro sobre EditText
, intenté configurar la entrada 1.5699856987. Entonces en la pantalla muestra 1.56, que es perfecto.
Entonces quería usar esta entrada para algunos otros cálculos, así que quería obtener el texto de ese campo de entrada ( EditText
). Cuando lo llamé mEditText.getText().toString()
devuelve 1.5699856987 que no era aceptable en mi caso.
Así que tuve que analizar el valor nuevamente después de obtenerlo de EditText
.
BigDecimal amount = new BigDecimal(Double.parseDouble(mEditText.getText().toString().trim()))
.setScale(2, RoundingMode.HALF_UP);
setScale
hace el truco aquí después de obtener el texto completo de EditText
.