Come altri hanno già detto, ho aggiunto questa classe al mio progetto e impostato il filtro sul valore EditText
desiderato.
Il filtro viene copiato dalla risposta di @ Pixel. Sto solo mettendo tutto insieme.
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 "";
}
}
Ora imposta il filtro in EditText
questo modo.
mEditText.setFilters(new InputFilter[]{new DecimalDigitsInputFilter()});
Qui una cosa importante è che risolve il mio problema di non consentire la visualizzazione di più di due cifre dopo il punto decimale in quello, EditText
ma il problema è che quando getText()
da quello EditText
, restituisce l'intero input che ho digitato.
Ad esempio, dopo aver applicato il filtro su EditText
, ho provato a impostare l'input 1.5699856987. Quindi nella schermata mostra 1.56 che è perfetto.
Quindi volevo usare questo input per alcuni altri calcoli, quindi volevo ottenere il testo da quel campo di input ( EditText
). Quando ho chiamatomEditText.getText().toString()
restituisce 1.5699856987 che non era accettabile nel mio caso.
Quindi ho dovuto analizzare nuovamente il valore dopo averlo ottenuto da EditText
.
BigDecimal amount = new BigDecimal(Double.parseDouble(mEditText.getText().toString().trim()))
.setScale(2, RoundingMode.HALF_UP);
setScale
fa il trucco qui dopo aver ottenuto il testo completo da EditText
.