Я пытаюсь написать приложение, которое поможет вам управлять своими финансами. Я использую EditText поле, в котором пользователь может указать сумму денег.
Я установил значение inputType в numberDecimal, которое работает нормально, за исключением того, что это позволяет людям вводить такие числа, как 123.122 что не идеально подходит для денег.
Есть ли способ ограничить количество символов после запятой двумя?
Переведено автоматически
Ответ 1
Более элегантным способом было бы использовать регулярное выражение ( regex ) следующим образом:
/** * Input filter that limits the number of decimal digits that are allowed to be * entered. */ publicclassDecimalDigitsInputFilterimplementsInputFilter {
@Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
intdotPos= -1; intlen= dest.length(); for (inti=0; i < len; i++) { charc= dest.charAt(i); if (c == '.' || c == ',') { dotPos = i; break; } } if (dotPos >= 0) {
// protects against many dots if (source.equals(".") || source.equals(",")) { return""; } // if the text is entered before the dot if (dend <= dotPos) { returnnull; } if (len - dotPos > decimalDigits) { return""; } }
@Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { CharSequenceout=super.filter(source, start, end, dest, dstart, dend);
// if changed, replace the source if (out != null) { source = out; start = 0; end = out.length(); }
intlen= end - start;
// if deleting, source is empty // and deleting can't break anything if (len == 0) { return source; }
intdlen= dest.length();
// Find the position of the decimal . for (inti=0; i < dstart; i++) { if (dest.charAt(i) == '.') { // being here means, that a number has // been inserted after the dot // check if the amount of digits is right return (dlen-(i+1) + len > digits) ? "" : newSpannableStringBuilder(source, start, end); } }
for (inti= start; i < end; ++i) { if (source.charAt(i) == '.') { // being here means, dot has been inserted // check if the amount of digits is right if ((dlen-dend) + (end-(i + 1)) > digits) return""; else break; // return new SpannableStringBuilder(source, start, end); } }
// if the dot is after the inserted part, // nothing can break returnnewSpannableStringBuilder(source, start, end); } }
Ответ 4
Вот пример InputFilter, который допускает не более 4 цифр до десятичной точки и не более 1 цифры после нее.
Значения, которые допускает edittext: 555,2, 555, .2
Значения, которые блокирует edittext: 55555.2, 055.2, 555.42
@Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { StringBuilderbuilder=newStringBuilder(dest); builder.replace(dstart, dend, source .subSequence(start, end).toString()); if (!builder.toString().matches( "(([1-9]{1})([0-9]{0,"+(maxDigitsBeforeDecimalPoint-1)+"})?)?(\\.[0-9]{0,"+maxDigitsAfterDecimalPoint+"})?"