Giới hạn các vị trí thập phân trong Android EditText


125

Tôi đang cố gắng viết một ứng dụng giúp bạn quản lý tài chính của mình. Tôi đang sử dụng một EditTextTrường nơi người dùng có thể chỉ định một số tiền.

Tôi đặt mục inputTypetiêu numberDecimalhoạt động tốt, ngoại trừ việc điều này cho phép mọi người nhập các số như 123.122không hoàn hảo cho tiền.

Có cách nào để giới hạn số lượng ký tự sau dấu thập phân xuống còn hai không?


Bạn có thể viết một biểu thức chính quy và xác minh nội dung của văn bản chỉnh sửa khi nó mất tiêu điểm.
đồ mù

Tôi đã tìm thấy InputFiltergiao diện, nó dường như làm những gì tôi muốn developer.android.com/reference/android/text/method/ , nhưng phương pháp filtermà tôi phải thực hiện khá khó hiểu với tôi. Có ai đó đã viết một Bộ lọc như vậy rồi và biết cách sử dụng nó?
Konstantin Weitz

Có bất kỳ giải pháp được đề xuất nào làm việc cho các địa phương RTL không? Theo như tôi có thể nói họ sẽ không ...
Nick

Câu trả lời:


118

Cách thanh lịch hơn sẽ là sử dụng biểu thức chính quy (regex) như sau:

public class DecimalDigitsInputFilter implements InputFilter {

Pattern mPattern;

public DecimalDigitsInputFilter(int digitsBeforeZero,int digitsAfterZero) {
    mPattern=Pattern.compile("[0-9]{0," + (digitsBeforeZero-1) + "}+((\\.[0-9]{0," + (digitsAfterZero-1) + "})?)||(\\.)?");
}

@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

        Matcher matcher=mPattern.matcher(dest);       
        if(!matcher.matches())
            return "";
        return null;
    }

}

Để sử dụng nó làm:

editText.setFilters(new InputFilter[] {new DecimalDigitsInputFilter(5,2)});

32
Xin chào, có một số trường hợp cạnh vẫn chưa được xử lý tốt. Chẳng hạn, sau khi tôi gõ 2.45, tôi có xu hướng "di chuyển con trỏ lên phía trước hầu hết văn bản". Tôi muốn tạo văn bản 12,45, nó sẽ không cho phép.
Cheok Yan Cheng

3
nó không cho phép thay đổi chữ số trước số thập phân sau khi người dùng đã nhập 2 chữ số sau dấu thập phân.
Gaurav Singla

9
Giải pháp tuyệt vời nhưng nó không hoàn toàn chính xác. Trình so khớp không nên kiểm tra mệnh, nó nên kiểm tra giá trị trong edittext (Dest.subSequence (0, dstart) + source.subSequence (bắt đầu, kết thúc) + Dest.subSequence (dend, Dest.length ()))
Mihaela Romanca

7
Mihaela đã đúng, chúng ta nên đối sánh với chuỗi đang cố gắng điền vào edittext. Tôi đã tìm thấy cách nối với một câu hỏi khác như CharSequence match = TextUtils.concat (Dest.subSequence (0, dstart), source.subSequence (bắt đầu, kết thúc), Dest.subSequence (dend, Dest.length ()); Regex đã gây ra sự cố sau đó vì vậy tôi đã thay đổi nó thành "^ \\ d {1," + chữ sốB BeforeZero + "} (\\. \\ d {0," + chữ sốAfterZero + "})? $" Nhưng bạn ' sau đó cũng sẽ phải xác nhận vì "1." là hợp lệ với regex đó nhưng chúng ta cần nó theo cách đó để thời gian có thể được gõ.
dt0

6
Làm thế nào bạn sẽ làm cho công việc này cho dấu phẩy (,) quá? Một số khu vực của số thập phân trên thế giới có dấu phẩy (ví dụ: 123,45).
Andrew

65

Giải pháp đơn giản hơn mà không cần sử dụng regex:

import android.text.InputFilter;
import android.text.Spanned;

/**
 * Input filter that limits the number of decimal digits that are allowed to be
 * entered.
 */
public class DecimalDigitsInputFilter implements InputFilter {

  private final int decimalDigits;

  /**
   * Constructor.
   * 
   * @param decimalDigits maximum decimal digits
   */
  public DecimalDigitsInputFilter(int decimalDigits) {
    this.decimalDigits = decimalDigits;
  }

  @Override
  public CharSequence filter(CharSequence source,
      int start,
      int end,
      Spanned dest,
      int dstart,
      int dend) {


    int dotPos = -1;
    int len = dest.length();
    for (int i = 0; i < len; i++) {
      char c = 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) {
        return null;
      }
      if (len - dotPos > decimalDigits) {
        return "";
      }
    }

    return null;
  }

}

Để sử dụng:

editText.setFilters(new InputFilter[] {new DecimalDigitsInputFilter(2)});

Điều gì sẽ ngăn tôi chèn các ký tự không phải số vào chuỗi, chẳng hạn như 'a'?
Konstantin Weitz

4
Cái này: <EditText ... android: inputType = "number" />
peceps

1
Đó phải là: editText.setFilters (new InputFilter [] {new DecimalDigitsInputFilter (2)});
frak

6
Điều này không xử lý trường hợp tôi gõ "999" và sau đó chèn dấu thập phân sau số 9. Đầu tiên
Jake Stoeffler

1
Cảm ơn điều này hữu ích. Chúng tôi cũng có thể hạn chế các chữ số trước dấu thập phân bằng cách sử dụng bộ lọc độ dài như thế này. Kotlin: edtAnyAmount.filters = ArrayOf <InputFilter> (InputFilter.LdropsFilter (7), DecimalDigitsInputFilter (2))
Faldu Jaldeep

37

Điều này thực hiện InputFiltergiải quyết vấn đề.

import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.method.DigitsKeyListener;

public class MoneyValueFilter extends DigitsKeyListener {
    public MoneyValueFilter() {
        super(false, true);
    }

    private int digits = 2;

    public void setDigits(int d) {
        digits = d;
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end,
            Spanned dest, int dstart, int dend) {
        CharSequence out = super.filter(source, start, end, dest, dstart, dend);

        // if changed, replace the source
        if (out != null) {
            source = out;
            start = 0;
            end = out.length();
        }

        int len = end - start;

        // if deleting, source is empty
        // and deleting can't break anything
        if (len == 0) {
            return source;
        }

        int dlen = dest.length();

        // Find the position of the decimal .
        for (int i = 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) ? 
                    "" :
                    new SpannableStringBuilder(source, start, end);
            }
        }

        for (int i = 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
        return new SpannableStringBuilder(source, start, end);
    }
}

Tôi có thể biết có bất kỳ lý do nào để chúng tôi cần trả lại SpannableStringBuilder thay vì null không? Tôi kiểm tra nó với null, nó cũng hoạt động tốt. Ngoài ra, có cần cho chúng tôi kế thừa từ DigitsKeyListener không? Khi sử dụng android: inputType = "numberDecimal" sẽ thực hiện tất cả "0123456789." thực thi nhân vật.
Cheok Yan Cheng

1
Hoạt động tốt. Cảm ơn rât nhiều.
Andrei Aulaska

34

Dưới đây là một InputFilter mẫu chỉ cho phép tối đa 4 chữ số trước dấu thập phân và tối đa 1 chữ số sau đó.

Các giá trị mà edittext cho phép: 555.2 , 555 , .2

Các giá trị mà khối edittext : 55555.2 , 055.2 , 555.42

        InputFilter filter = new InputFilter() {
        final int maxDigitsBeforeDecimalPoint=4;
        final int maxDigitsAfterDecimalPoint=1;

        @Override
        public CharSequence filter(CharSequence source, int start, int end,
                Spanned dest, int dstart, int dend) {
                StringBuilder builder = new StringBuilder(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+"})?"

                        )) {
                    if(source.length()==0)
                        return dest.subSequence(dstart, dend);
                    return "";
                }

            return null;

        }
    };

    mEdittext.setFilters(new InputFilter[] { filter });

không cho phép. được đánh máy
AmiNadimi

22

Tôi đã thực hiện một số bản sửa lỗi cho giải pháp @Pinhassi. Nó xử lý một số trường hợp:

1. bạn có thể di chuyển con trỏ đến bất cứ đâu

2.minus xử lý dấu hiệu

3.digitsb Before = 2 và Digitsafter = 4 và bạn nhập 12,4545. Sau đó, nếu bạn muốn xóa ".", Nó sẽ không cho phép.

public class DecimalDigitsInputFilter implements InputFilter {
    private int mDigitsBeforeZero;
    private int mDigitsAfterZero;
    private Pattern mPattern;

    private static final int DIGITS_BEFORE_ZERO_DEFAULT = 100;
    private static final int DIGITS_AFTER_ZERO_DEFAULT = 100;

    public DecimalDigitsInputFilter(Integer digitsBeforeZero, Integer digitsAfterZero) {
    this.mDigitsBeforeZero = (digitsBeforeZero != null ? digitsBeforeZero : DIGITS_BEFORE_ZERO_DEFAULT);
    this.mDigitsAfterZero = (digitsAfterZero != null ? digitsAfterZero : DIGITS_AFTER_ZERO_DEFAULT);
    mPattern = Pattern.compile("-?[0-9]{0," + (mDigitsBeforeZero) + "}+((\\.[0-9]{0," + (mDigitsAfterZero)
        + "})?)||(\\.)?");
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    String replacement = source.subSequence(start, end).toString();
    String newVal = dest.subSequence(0, dstart).toString() + replacement
        + dest.subSequence(dend, dest.length()).toString();
    Matcher matcher = mPattern.matcher(newVal);
    if (matcher.matches())
        return null;

    if (TextUtils.isEmpty(source))
        return dest.subSequence(dstart, dend);
    else
        return "";
    }
}

Tôi nghĩ rằng nó nên là giải pháp hoàn hảo, làm cho ngày của tôi. Cảm ơn bạn.
Pratik Butani

1
@Omkar điều này là sai. điều kiện này sẽ luôn luôn đúng ngay cả khi độ dài> 0, Dest.length () == 0 luôn luôn đúng ngay cả khi bạn chỉnh sửa toàn bộ văn bản nhiều hơn 0 ...
user924

@Omkar xóa bình luận của bạn xin vui lòng
user924

@android_dev tại sao tôi không thể nhập giá trị âm (trừ)?
user924

NẾU bạn đặt android:inputType="number"hoặc android:inputType="numberDecimal"nó sẽ không cho phép gõ trừ, điều này android:digits="0123456789.-"không có ích
dùng924

18

Tôi không thích giải pháp khác và tôi tự tạo ra. Với giải pháp này, bạn không thể nhập nhiều hơn MAX_BEFORE_POINT chữ số trước điểm và số thập phân không thể nhiều hơn MAX_DECIMAL.

Bạn không thể gõ chữ số vượt quá, không có hiệu ứng khác! Ngoài ra nếu bạn viết "." nó gõ "0."

  1. Đặt EditText trong bố cục thành:

    android: inputType = "numberDecimal"

  2. Thêm Listener trong onCreate của bạn. Nếu bạn muốn sửa đổi số chữ số trước và sau điểm chỉnh sửa cuộc gọi thành PerfectDecimal (str, NUMBER_BEFORE_POINT, NUMBER_DECIMALS), ở đây được đặt thành 3 và 2

    EditText targetEditText = (EditText)findViewById(R.id.targetEditTextLayoutId);
    
    targetEditText.addTextChangedListener(new TextWatcher() {
      public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {}
    
      public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {}
    
      public void afterTextChanged(Editable arg0) {
        String str = targetEditText.getText().toString();
        if (str.isEmpty()) return;
        String str2 = PerfectDecimal(str, 3, 2);
    
        if (!str2.equals(str)) {
            targetEditText.setText(str2);
            int pos = targetEditText.getText().length();
            targetEditText.setSelection(pos);
        }
      }
    });
  3. Bao gồm Funcion này:

    public String PerfectDecimal(String str, int MAX_BEFORE_POINT, int MAX_DECIMAL){
      if(str.charAt(0) == '.') str = "0"+str;
      int max = str.length();
    
      String rFinal = "";
      boolean after = false;
      int i = 0, up = 0, decimal = 0; char t;
      while(i < max){
        t = str.charAt(i);
        if(t != '.' && after == false){
            up++;
            if(up > MAX_BEFORE_POINT) return rFinal;
        }else if(t == '.'){
            after = true;
        }else{
            decimal++;
            if(decimal > MAX_DECIMAL)
                return rFinal;
        }
        rFinal = rFinal + t;
        i++;
      }return rFinal;
    }

Và thế là xong!


1
Chúc mừng. Làm việc rất tốt khi người kia không làm việc cho tôi
Bear

1
Đây phải là câu trả lời được chấp nhận .. Thật hoàn hảo .. Tất cả các điều kiện đều được thỏa mãn ở đây.
Naya

1
Trên tất cả các câu trả lời được bình chọn cao, câu trả lời này thực sự có hiệu quả với tôi.
Rohit Mandiwal

Làm tốt! Tôi đã thử tất cả các kết hợp và có vẻ như nó hoạt động rất tốt. Cảm ơn bạn.
akelec

Tôi không biết làm thế nào nó hoạt động, nhưng nó chỉ hoạt động như một bùa mê.
wonsuc

17

Tôi đã đạt được điều này với sự giúp đỡ của TextWatchercách sau

final EditText et = (EditText) findViewById(R.id.EditText1);
int count = -1;
et.addTextChangedListener(new TextWatcher() {
    public void onTextChanged(CharSequence arg0, int arg1, int arg2,int arg3) {             

    }
    public void beforeTextChanged(CharSequence arg0, int arg1,int arg2, int arg3) {             

    }

    public void afterTextChanged(Editable arg0) {
        if (arg0.length() > 0) {
            String str = et.getText().toString();
            et.setOnKeyListener(new OnKeyListener() {
                public boolean onKey(View v, int keyCode, KeyEvent event) {
                    if (keyCode == KeyEvent.KEYCODE_DEL) {
                        count--;
                        InputFilter[] fArray = new InputFilter[1];
                        fArray[0] = new InputFilter.LengthFilter(100);
                        et.setFilters(fArray);
                        //change the edittext's maximum length to 100. 
                        //If we didn't change this the edittext's maximum length will
                        //be number of digits we previously entered.
                    }
                    return false;
                }
            });
            char t = str.charAt(arg0.length() - 1);
            if (t == '.') {
                count = 0;
            }
            if (count >= 0) {
                if (count == 2) {                        
                    InputFilter[] fArray = new InputFilter[1];
                    fArray[0] = new InputFilter.LengthFilter(arg0.length());
                    et.setFilters(fArray);
                    //prevent the edittext from accessing digits 
                    //by setting maximum length as total number of digits we typed till now.
                }
                count++;
            }
        }
    }
});

Giải pháp này sẽ không cho phép người dùng nhập nhiều hơn hai chữ số sau dấu thập phân. Ngoài ra, bạn có thể nhập bất kỳ số chữ số trước dấu thập phân. Xem blog này http://v4all123.blogspot.com/2013/05/set-limit-for-fraction-in-decimal.html để đặt bộ lọc cho nhiều EditText. Hy vọng điều này có thể giúp cho bạn. Cảm ơn bạn.


Xin lỗi vì thông tin muộn. Đừng quên khởi tạo countvới -1. Sau đó, chỉ điều này sẽ hoạt động chính xác. int count = -1;
Gunaseelan

Gunaseelan - tôi đã thử đoạn mã trên và nó hoạt động tốt. Nhưng khi tôi xóa văn bản đã gõ và bắt đầu gõ lại, nó chỉ gõ một chữ số, bất kỳ giải pháp nào cho việc này .....
Siva K

@SivaK Không có cách nào bạn ạ. Nếu bạn xóa và sau đó gõ nó sẽ chấp nhận tối thiểu 100 chữ số. Tôi không làm thế nào bạn truy cập này listener. Bất kỳ cách nào xin hãy xem một blog bài . Bạn có thể có được một ý tưởng. Nếu bạn không thể xin vui lòng cho tôi biết. Tôi sẽ giúp bạn về vấn đề này.
Gunaseelan

Tôi đã xác minh những gì @SivaK đã nói. Điều này là thông minh trong mọi trường hợp nhưng tôi sẽ thực hiện một số chỉnh sửa để nó có đầy đủ chức năng (theo ý kiến ​​của tôi)
MrTristan 10/2/2015

@Gunaseelan cảm ơn giải pháp của bạn. Nhưng nó có một số lỗi. Ví dụ, khi tôi xóa số thập phân thứ hai, không thể gõ lại số đó (tôi phải xóa tất cả số thập phân để có thể nhập lại số thập phân). Ngoài ra, sau khi xóa toàn bộ mục, một số hạn chế lạ xảy ra khi gõ lại.
akelec

14

Bộ lọc đầu vào mà tôi đã đưa ra cho phép bạn định cấu hình số chữ số trước và sau vị trí thập phân. Ngoài ra, nó không cho phép các số 0 hàng đầu.

public class DecimalDigitsInputFilter implements InputFilter
{
    Pattern pattern;

    public DecimalDigitsInputFilter(int digitsBeforeDecimal, int digitsAfterDecimal)
    {
        pattern = Pattern.compile("(([1-9]{1}[0-9]{0," + (digitsBeforeDecimal - 1) + "})?||[0]{1})((\\.[0-9]{0," + digitsAfterDecimal + "})?)||(\\.)?");
    }

    @Override public CharSequence filter(CharSequence source, int sourceStart, int sourceEnd, Spanned destination, int destinationStart, int destinationEnd)
    {
        // Remove the string out of destination that is to be replaced.
        String newString = destination.toString().substring(0, destinationStart) + destination.toString().substring(destinationEnd, destination.toString().length());

        // Add the new string in.
        newString = newString.substring(0, destinationStart) + source.toString() + newString.substring(destinationStart, newString.length());

        // Now check if the new string is valid.
        Matcher matcher = pattern.matcher(newString);

        if(matcher.matches())
        {
            // Returning null indicates that the input is valid.
            return null;
        }

        // Returning the empty string indicates the input is invalid.
        return "";
    }
}

// To use this InputFilter, attach it to your EditText like so:
final EditText editText = (EditText) findViewById(R.id.editText);

EditText.setFilters(new InputFilter[]{new DecimalDigitsInputFilter(4, 4)});

Giải pháp tốt đẹp! Nó hoạt động với tôi, nhưng tôi muốn không cho phép giai đoạn hàng đầu (dấu chấm). Ví dụ: ".123" không được phép trình tự. Làm thế nào để đạt được điều này?
ibogolyubskiy

13

Yêu cầu là 2 chữ số sau số thập phân. Không nên có giới hạn cho các chữ số trước dấu thập phân. Vì vậy, giải pháp nên được,

public class DecimalDigitsInputFilter implements InputFilter {

    Pattern mPattern;

    public DecimalDigitsInputFilter() {
        mPattern = Pattern.compile("[0-9]*+((\\.[0-9]?)?)||(\\.)?");
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        Matcher matcher = mPattern.matcher(dest);
        if (!matcher.matches())
            return "";
        return null;
    }
}

Và sử dụng nó như là,

mEditText.setFilters(new InputFilter[]{new DecimalDigitsInputFilter()});

Cảm ơn @Pinhassi đã truyền cảm hứng.


Tốt ... Hoạt động tốt
jojo

12

Giải pháp của tôi rất đơn giản và hoạt động hoàn hảo!

public class DecimalInputTextWatcher implements TextWatcher {

private String mPreviousValue;
private int mCursorPosition;
private boolean mRestoringPreviousValueFlag;
private int mDigitsAfterZero;
private EditText mEditText;

public DecimalInputTextWatcher(EditText editText, int digitsAfterZero) {
    mDigitsAfterZero = digitsAfterZero;
    mEditText = editText;
    mPreviousValue = "";
    mRestoringPreviousValueFlag = false;
}

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    if (!mRestoringPreviousValueFlag) {
        mPreviousValue = s.toString();
        mCursorPosition = mEditText.getSelectionStart();
    }
}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}

@Override
public void afterTextChanged(Editable s) {
    if (!mRestoringPreviousValueFlag) {

        if (!isValid(s.toString())) {
            mRestoringPreviousValueFlag = true;
            restorePreviousValue();
        }

    } else {
        mRestoringPreviousValueFlag = false;
    }
}

private void restorePreviousValue() {
    mEditText.setText(mPreviousValue);
    mEditText.setSelection(mCursorPosition);
}

private boolean isValid(String s) {
    Pattern patternWithDot = Pattern.compile("[0-9]*((\\.[0-9]{0," + mDigitsAfterZero + "})?)||(\\.)?");
    Pattern patternWithComma = Pattern.compile("[0-9]*((,[0-9]{0," + mDigitsAfterZero + "})?)||(,)?");

    Matcher matcherDot = patternWithDot.matcher(s);
    Matcher matcherComa = patternWithComma.matcher(s);

    return matcherDot.matches() || matcherComa.matches();
}
}

Sử dụng:

myTextEdit.addTextChangedListener(new DecimalInputTextWatcher(myTextEdit, 2));

Di chuyển các mẫu từ isValid()sang constructor để tránh tạo lại các mẫu trên mỗi isValid()cuộc gọi.
Hemant Kaushik

6

Hãy thử sử dụng NumberFormat.getCurrencyInstance () để định dạng chuỗi của bạn trước khi bạn đặt nó vào TextView.

Cái gì đó như:

NumberFormat currency = NumberFormat.getCurrencyInstance();
myTextView.setText(currency.format(dollars));

Chỉnh sửa - Không có loại đầu vào cho loại tiền mà tôi có thể tìm thấy trong các tài liệu. Tôi tưởng tượng điều này là do có một số loại tiền không tuân theo quy tắc tương tự cho các số thập phân, chẳng hạn như Yên Nhật.

Như LeffelMania đã đề cập, bạn có thể sửa lỗi nhập của người dùng bằng cách sử dụng mã ở trên với mã TextWatcherđược đặt trên của bạn EditText.


6

Cải thiện một chút giải pháp @Pinhassi.

Hoạt động rất tốt. Nó xác nhận các chuỗi nối.

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 "";
}

 }

6

Tôi đã sửa đổi các giải pháp trên và tạo ra sau đây. Bạn có thể đặt số chữ số trước và sau dấu thập phân.

public class DecimalDigitsInputFilter implements InputFilter {

private final Pattern mPattern;

public DecimalDigitsInputFilter(int digitsBeforeZero, int digitsAfterZero) {
    mPattern = Pattern.compile(String.format("[0-9]{0,%d}(\\.[0-9]{0,%d})?", digitsBeforeZero, digitsAfterZero));
}

@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    Matcher matcher = mPattern.matcher(createResultString(source, start, end, dest, dstart, dend));
    if (!matcher.matches())
        return "";
    return null;
}

private String createResultString(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    String sourceString = source.toString();
    String destString = dest.toString();
    return destString.substring(0, dstart) + sourceString.substring(start, end) + destString.substring(dend);
}

}


Nó gần như là những gì reisub đã trả lời cho cùng một câu hỏi ở đây vào năm 2014.
Mehul Joisar

5
DecimalFormat form = new DecimalFormat("#.##", new DecimalFormatSymbols(Locale.US));
    EditText et; 
    et.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

        if (actionId == EditorInfo.IME_ACTION_DONE) {
            double a = Double.parseDouble(et.getText().toString());
            et.setText(form.format(a));
        }
        return false;
    }
});

Điều này làm là khi bạn thoát khỏi giai đoạn chỉnh sửa, nó định dạng trường theo đúng định dạng. Tại thời điểm này, nó chỉ có 2 ký tự thập phân. Tôi nghĩ rằng đây là cách khá dễ dàng để làm điều này.


4

Tất cả các câu trả lời ở đây khá phức tạp Tôi đã cố gắng làm cho nó đơn giản hơn nhiều. Hãy xem mã của tôi và tự quyết định -

int temp  = 0;
int check = 0;

editText.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

        if(editText.getText().toString().length()<temp)
        {
            if(!editText.getText().toString().contains("."))
                editText.setFilters(new InputFilter[] { new InputFilter.LengthFilter(editText.getText().toString().length()-1) });
            else
                editText.setFilters(new InputFilter[] { new InputFilter.LengthFilter(editText.getText().toString().length()+1) });

        }

        if(!editText.getText().toString().contains("."))
        {
            editText.setFilters(new InputFilter[] { new InputFilter.LengthFilter(editText.getText().toString().length()+1) });
            check=0;
        }


        else if(check==0)
        {
            check=1;
            editText.setFilters(new InputFilter[] { new InputFilter.LengthFilter(editText.getText().toString().length()+2) });
        }
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
        temp = editText.getText().toString().length();


    }

    @Override
    public void afterTextChanged(Editable s) {
        // TODO Auto-generated method stub

    }
});

nó làm việc hoàn hảo cho tôi Tôi đã kiểm tra tất cả các kịch bản. Cảm ơn.
Amarnath Baitha

Giả sử tôi đã nhập 1234.56, bây giờ tôi muốn chỉnh sửa nó như thế này 12378.56, tôi không thể làm điều đó mà không xóa số thập phân.
Aman Verma

4

Tôi thực sự thích câu trả lời của Pinhassi, nhưng nhận thấy rằng sau khi người dùng đã nhập các chữ số số được chỉ định sau dấu thập phân, bạn không còn có thể nhập văn bản vào phía bên trái của dấu thập phân. Vấn đề là giải pháp chỉ kiểm tra văn bản trước đó đã được nhập, không phải văn bản hiện tại được nhập. Vì vậy, đây là giải pháp của tôi chèn ký tự mới vào văn bản gốc để xác thực.

package com.test.test;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.text.InputFilter;
import android.text.Spanned;
import android.util.Log;

public class InputFilterCurrency implements InputFilter {
    Pattern moPattern;

    public InputFilterCurrency(int aiMinorUnits) {
        // http://www.regexplanet.com/advanced/java/index.html
        moPattern=Pattern.compile("[0-9]*+((\\.[0-9]{0,"+ aiMinorUnits + "})?)||(\\.)?");

    } // InputFilterCurrency

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        String lsStart  = "";
        String lsInsert = "";
        String lsEnd    = "";
        String lsText   = "";

        Log.d("debug", moPattern.toString());
        Log.d("debug", "source: " + source + ", start: " + start + ", end:" + end + ", dest: " + dest + ", dstart: " + dstart + ", dend: " + dend );

        lsText = dest.toString();

        // If the length is greater then 0, then insert the new character
        // into the original text for validation
        if (lsText.length() > 0) {

            lsStart = lsText.substring(0, dstart);
            Log.d("debug", "lsStart : " + lsStart);
            // Check to see if they have deleted a character
            if (source != "") {
                lsInsert = source.toString();
                Log.d("debug", "lsInsert: " + lsInsert);
            } // if
            lsEnd = lsText.substring(dend);
            Log.d("debug", "lsEnd   : " + lsEnd);
            lsText = lsStart + lsInsert + lsEnd;
            Log.d("debug", "lsText  : " + lsText);

        } // if

        Matcher loMatcher = moPattern.matcher(lsText);
        Log.d("debug", "loMatcher.matches(): " + loMatcher.matches() + ", lsText: " + lsText);
        if(!loMatcher.matches()) {
            return "";
        }
        return null;

    } // CharSequence

} // InputFilterCurrency

Và cuộc gọi để đặt bộ lọc editText

editText.setFilters(new InputFilter[] {new InputFilterCurrency(2)});

Ouput with two decimal places
05-22 15:25:33.434: D/debug(30524): [0-9]*+((\.[0-9]{0,2})?)||(\.)?
05-22 15:25:33.434: D/debug(30524): source: 5, start: 0, end:1, dest: 123.4, dstart: 5, dend: 5
05-22 15:25:33.434: D/debug(30524): lsStart : 123.4
05-22 15:25:33.434: D/debug(30524): lsInsert: 5
05-22 15:25:33.434: D/debug(30524): lsEnd   : 
05-22 15:25:33.434: D/debug(30524): lsText  : 123.45
05-22 15:25:33.434: D/debug(30524): loMatcher.matches(): true, lsText: 123.45

Ouput inserting a 5 in the middle
05-22 15:26:17.624: D/debug(30524): [0-9]*+((\.[0-9]{0,2})?)||(\.)?
05-22 15:26:17.624: D/debug(30524): source: 5, start: 0, end:1, dest: 123.45, dstart: 2, dend: 2
05-22 15:26:17.624: D/debug(30524): lsStart : 12
05-22 15:26:17.624: D/debug(30524): lsInsert: 5
05-22 15:26:17.624: D/debug(30524): lsEnd   : 3.45
05-22 15:26:17.624: D/debug(30524): lsText  : 1253.45
05-22 15:26:17.624: D/debug(30524): loMatcher.matches(): true, lsText: 1253.45

4

Tôi đã cải thiện giải pháp sử dụng regex của Pinhassi để nó cũng xử lý các trường hợp cạnh một cách chính xác. Trước khi kiểm tra xem đầu vào có đúng không, đầu tiên chuỗi cuối cùng được xây dựng như được mô tả bởi các tài liệu Android.

public class DecimalDigitsInputFilter implements InputFilter {

    private Pattern mPattern;

    private static final Pattern mFormatPattern = Pattern.compile("\\d+\\.\\d+");

    public DecimalDigitsInputFilter(int digitsBeforeDecimal, int digitsAfterDecimal) {
        mPattern = Pattern.compile(
            "^\\d{0," + digitsBeforeDecimal + "}([\\.,](\\d{0," + digitsAfterDecimal +
                "})?)?$");
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, 
                               int dstart, int dend) {

        String newString =
            dest.toString().substring(0, dstart) + source.toString().substring(start, end) 
            + dest.toString().substring(dend, dest.toString().length());

        Matcher matcher = mPattern.matcher(newString);
        if (!matcher.matches()) {
            return "";
        }
        return null;
    }
}

Sử dụng:

editText.setFilters(new InputFilter[] {new DecimalDigitsInputFilter(5,2)});

4

Lớp Trình trợ giúp đơn giản có ở đây để ngăn người dùng nhập nhiều hơn 2 chữ số sau số thập phân:

public class CostFormatter  implements TextWatcher {

private final EditText costEditText;

public CostFormatter(EditText costEditText) {
    this.costEditText = costEditText;
}

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}

@Override
public synchronized void afterTextChanged(final Editable text) {
    String cost = text.toString().trim();

    if(!cost.endsWith(".") && cost.contains(".")){
        String numberBeforeDecimal = cost.split("\\.")[0];
        String numberAfterDecimal = cost.split("\\.")[1];

        if(numberAfterDecimal.length() > 2){
            numberAfterDecimal = numberAfterDecimal.substring(0, 2);
        }
        cost = numberBeforeDecimal + "." + numberAfterDecimal;
    }
    costEditText.removeTextChangedListener(this);
    costEditText.setText(cost);
    costEditText.setSelection(costEditText.getText().toString().trim().length());
    costEditText.addTextChangedListener(this);
}
}

4

Tôi đã thay đổi câu trả lời №6 (bởi Favas Kv) bởi vì ở đó Bạn có thể đặt điểm ở vị trí đầu tiên.

final InputFilter [] filter = { new InputFilter() {

    @Override
    public CharSequence filter(CharSequence source, int start, int end,
                               Spanned dest, int dstart, int dend) {
        StringBuilder builder = new StringBuilder(dest);
        builder.replace(dstart, dend, source
                .subSequence(start, end).toString());
        if (!builder.toString().matches(
                "(([1-9]{1})([0-9]{0,4})?(\\.)?)?([0-9]{0,2})?"

        )) {
            if(source.length()==0)
                return dest.subSequence(dstart, dend);
            return "";
        }
        return null;
    }
}};

3

Giống như những người khác đã nói, tôi đã thêm lớp này trong dự án của mình và đặt bộ lọc thành EditTexttôi muốn.

Bộ lọc được sao chép từ câu trả lời của @ Pixel. Tôi chỉ cần đặt tất cả lại với nhau.

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 "";
    }
}

Bây giờ đặt bộ lọc trong của bạn EditTextnhư thế này.

mEditText.setFilters(new InputFilter[]{new DecimalDigitsInputFilter()});

Ở đây, một điều quan trọng là nó giải quyết vấn đề của tôi là không cho phép hiển thị nhiều hơn hai chữ số sau dấu thập phân trong đó EditTextnhưng vấn đề là khi tôi getText()từ đó EditText, nó trả về toàn bộ đầu vào tôi đã nhập.

Ví dụ: sau khi áp dụng bộ lọc qua EditText, tôi đã thử đặt đầu vào 1.5699856987. Vì vậy, trong màn hình, nó hiển thị 1.56 là hoàn hảo.

Sau đó, tôi muốn sử dụng đầu vào này cho một số tính toán khác vì vậy tôi muốn lấy văn bản từ trường đầu vào đó ( EditText). Khi tôi gọimEditText.getText().toString() nó trả về 1.5699856987 không được chấp nhận trong trường hợp của tôi.

Vì vậy, tôi đã phải phân tích giá trị một lần nữa sau khi nhận được nó từ EditText.

BigDecimal amount = new BigDecimal(Double.parseDouble(mEditText.getText().toString().trim()))
    .setScale(2, RoundingMode.HALF_UP);

setScalethực hiện các mẹo ở đây sau khi nhận được toàn văn từ EditText.


Xin chào, làm thế nào tôi có thể chắc chắn rằng nếu người dùng không nhập số thập phân (.) Thì anh ta không thể nhập nhiều hơn 2 chữ số?
ManishNegi

2

Tôi cũng đã gặp vấn đề này. Tôi muốn có thể sử dụng lại mã trong nhiều EditTexts. Đây là giải pháp của tôi:

Sử dụng :

CurrencyFormat watcher = new CurrencyFormat();
priceEditText.addTextChangedListener(watcher);

Lớp học:

public static class CurrencyFormat implements TextWatcher {

    public void onTextChanged(CharSequence arg0, int start, int arg2,int arg3) {}

    public void beforeTextChanged(CharSequence arg0, int start,int arg2, int arg3) {}

    public void afterTextChanged(Editable arg0) {
        int length = arg0.length();
        if(length>0){
            if(nrOfDecimal(arg0.toString())>2)
                    arg0.delete(length-1, length);
        }

    }


    private int nrOfDecimal(String nr){
        int len = nr.length();
        int pos = len;
        for(int i=0 ; i<len; i++){
            if(nr.charAt(i)=='.'){
                pos=i+1;
                    break;
            }
        }
        return len-pos;
    }
}

2

@ Mẹ cho bạn ..

txtlist.setFilters(new InputFilter[] { new DigitsKeyListener( Boolean.FALSE,Boolean.TRUE) {

        int beforeDecimal = 7;
        int afterDecimal = 2;

        @Override
        public CharSequence filter(CharSequence source, int start, int end,Spanned dest, int dstart, int dend) {

            String etText = txtlist.getText().toString();
            String temp = txtlist.getText() + source.toString();
            if (temp.equals(".")) {
                return "0.";
            } else if (temp.toString().indexOf(".") == -1) {
                // no decimal point placed yet
                 if (temp.length() > beforeDecimal) {
                    return "";
                }
            } else {
                int dotPosition ;
                int cursorPositon = txtlistprice.getSelectionStart();
                if (etText.indexOf(".") == -1) {
                    dotPosition = temp.indexOf(".");
                }else{
                    dotPosition = etText.indexOf(".");
                }
                if(cursorPositon <= dotPosition){
                    String beforeDot = etText.substring(0, dotPosition);
                    if(beforeDot.length()<beforeDecimal){
                        return source;
                    }else{
                        if(source.toString().equalsIgnoreCase(".")){
                            return source;
                        }else{
                            return "";
                        }
                    }
                }else{
                    temp = temp.substring(temp.indexOf(".") + 1);
                    if (temp.length() > afterDecimal) {
                        return "";
                    }
                }
            }
            return super.filter(source, start, end, dest, dstart, dend);
        }
    } });

2

Một phản hồi rất muộn: Chúng ta có thể làm điều đó đơn giản như thế này:

etv.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (s.toString().length() > 3 && s.toString().contains(".")) {
                if (s.toString().length() - s.toString().indexOf(".") > 3) {
                    etv.setText(s.toString().substring(0, s.length() - 1));
                    etv.setSelection(edtSendMoney.getText().length());
                }
            }
        }

        @Override
        public void afterTextChanged(Editable arg0) {
        }
}

2

Đây là TextWatcherchỉ cho phép n số chữ số sau dấu thập phân.

Trình xem văn bản

private static boolean flag;
public static TextWatcher getTextWatcherAllowAfterDeci(final int allowAfterDecimal){

    TextWatcher watcher = new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // TODO Auto-generated method stub

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub
            String str = s.toString();
            int index = str.indexOf ( "." );
            if(index>=0){
                if((index+1)<str.length()){
                    String numberD = str.substring(index+1);
                    if (numberD.length()!=allowAfterDecimal) {
                        flag=true;
                    }else{
                        flag=false;
                    }   
                }else{
                    flag = false;
                }                   
            }else{
                flag=false;
            }
            if(flag)
                s.delete(s.length() - 1,
                        s.length());
        }
    };
    return watcher;
}

Cách sử dụng

yourEditText.addTextChangedListener(getTextWatcherAllowAfterDeci(1));

Hoạt động như một lá bùa !! Cảm ơn Hiren :)
nisha.113a5

2

Cách đơn giản nhất để đạt được điều đó là:

et.addTextChangedListener(new TextWatcher() {
    public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
        String text = arg0.toString();
        if (text.contains(".") && text.substring(text.indexOf(".") + 1).length() > 2) {
            et.setText(text.substring(0, text.length() - 1));
            et.setSelection(et.getText().length());
        }
    }

    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {

    }

    public void afterTextChanged(Editable arg0) {
    }
});

Câu trả lời đơn giản và dễ hiểu
Logo

1

Đây là giải pháp của tôi:

     yourEditText.addTextChangedListener(new TextWatcher() {
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            NumberFormat formatter = new DecimalFormat("#.##");
            double doubleVal = Double.parseDouble(s.toString());
            yourEditText.setText(formatter.format(doubleVal));
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,int after) {}

        @Override
        public void afterTextChanged(Editable s) {}
    });

Nếu người dùng nhập một số có nhiều hơn hai số sau dấu thập phân, nó sẽ tự động được sửa.

Tôi hy vọng tôi đã giúp!


Bạn đã kiểm tra mã này? Nó không thực sự hoạt động, bởi vì bất cứ khi nào bạn gọi setText () thì TextWatcher lại kích hoạt => vòng lặp vô hạn.
muetzenflo

06-07 08: 01: 35.006: E / AndroidR.78 (30230): java.lang.StackOverflowError Không hoạt động
Anjula

1

Cái này làm việc tốt cho tôi. Nó cho phép nhập giá trị ngay cả sau khi tiêu điểm thay đổi và lấy lại. Ví dụ: 123.00, 12.12, 0.01, vv ..

1. Integer.parseInt(getString(R.string.valuelength)) Chỉ định độ dài của đầu vào được digits.Valuestruy cập từ string.xmltệp. Thật dễ dàng để thay đổi giá trị. 2. Integer.parseInt(getString(R.string.valuedecimal)), đây là cho số thập phân giới hạn tối đa.

private InputFilter[] valDecimalPlaces;
private ArrayList<EditText> edittextArray;

valDecimalPlaces = new InputFilter[] { new DecimalDigitsInputFilterNew(
    Integer.parseInt(getString(R.string.valuelength)),
    Integer.parseInt(getString(R.string.valuedecimal))) 
};

Mảng các EditTextgiá trị cho phép thực hiện hành động.

for (EditText etDecimalPlace : edittextArray) {
            etDecimalPlace.setFilters(valDecimalPlaces);

Tôi chỉ sử dụng mảng các giá trị có chứa nhiều tệp edittext Tiếp theo DecimalDigitsInputFilterNew.class.

import android.text.InputFilter;
import android.text.Spanned;

public class DecimalDigitsInputFilterNew implements InputFilter {

    private final int decimalDigits;
    private final int before;

    public DecimalDigitsInputFilterNew(int before ,int decimalDigits) {
        this.decimalDigits = decimalDigits;
        this.before = before;
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end,
        Spanned dest, int dstart, int dend) {
        StringBuilder builder = new StringBuilder(dest);
        builder.replace(dstart, dend, source
              .subSequence(start, end).toString());
        if (!builder.toString().matches("(([0-9]{1})([0-9]{0,"+(before-1)+"})?)?(\\.[0-9]{0,"+decimalDigits+"})?")) {
             if(source.length()==0)
                  return dest.subSequence(dstart, dend);
             return "";
        }
        return null;
    }
}

1

Điều này là để xây dựng dựa trên câu trả lời của pinhassi - vấn đề mà tôi gặp phải là bạn không thể thêm giá trị trước số thập phân một khi đã đạt đến giới hạn thập phân. Để khắc phục sự cố, chúng ta cần xây dựng chuỗi cuối cùng trước khi thực hiện khớp mẫu.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.text.InputFilter;
import android.text.Spanned;

public class DecimalLimiter implements InputFilter
{
    Pattern mPattern;

    public DecimalLimiter(int digitsBeforeZero,int digitsAfterZero) 
    {
        mPattern=Pattern.compile("[0-9]{0," + (digitsBeforeZero) + "}+((\\.[0-9]{0," + (digitsAfterZero) + "})?)||(\\.)?");
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) 
    {
        StringBuilder sb = new StringBuilder(dest);
        sb.insert(dstart, source, start, end);

        Matcher matcher = mPattern.matcher(sb.toString());
        if(!matcher.matches())
            return "";
        return null;
    }
}

1
et = (EditText) vw.findViewById(R.id.tx_edittext);

et.setFilters(new InputFilter[] {
        new DigitsKeyListener(Boolean.FALSE, Boolean.TRUE) {
            int beforeDecimal = 5, afterDecimal = 2;

            @Override
            public CharSequence filter(CharSequence source, int start, int end,
                    Spanned dest, int dstart, int dend) {
                String temp = et.getText() + source.toString();

                if (temp.equals(".")) {
                    return "0.";
                }
                else if (temp.toString().indexOf(".") == -1) {
                    // no decimal point placed yet
                    if (temp.length() > beforeDecimal) {
                        return "";
                    }
                } else {
                    temp = temp.substring(temp.indexOf(".") + 1);
                    if (temp.length() > afterDecimal) {
                        return "";
                    }
                }

                return super.filter(source, start, end, dest, dstart, dend);
            }
        }
});

Khoảng 2 năm kể từ thời gian trả lời của bạn. Tôi đã thử sử dụng mã của bạn sau đó tôi thấy vấn đề về giải pháp của bạn là bạn nối thêm sourcesau đó et.getText(). Nó luôn hiểu rằng mọi người gõ vào cuối hộp thay vì bắt đầu hộp. StringBuilder stringBuilder = new StringBuilder(text.getText().toString()); stringBuilder.replace(dstart, dend, source.toString()); String temp = stringBuilder.toString();nên làm việc. Dẫu sao cũng xin cảm ơn.
Trương Hiếu

1

Tạo một lớp mới trong kotlin Android với tên DecimalDigitsInputFilter

class DecimalDigitsInputFilter(digitsBeforeZero: Int, digitsAfterZero: Int) : InputFilter {
lateinit var mPattern: Pattern
init {
    mPattern =
        Pattern.compile("[0-9]{0," + (digitsBeforeZero) + "}+((\\.[0-9]{0," + (digitsAfterZero) + "})?)||(\\.)?")
}
override fun filter(
    source: CharSequence?,
    start: Int,
    end: Int,
    dest: Spanned?,
    dstart: Int,
    dend: Int
): CharSequence? {
    val matcher: Matcher = mPattern.matcher(dest?.subSequence(0, dstart).toString() + source?.subSequence(start, end).toString() + dest?.subSequence(dend, dest?.length!!).toString())
    if (!matcher.matches())
        return ""
    else
        return null
}

Gọi lớp này với dòng sau

 et_buy_amount.filters = (arrayOf<InputFilter>(DecimalDigitsInputFilter(8,2)))

Có quá nhiều câu trả lời giống nhau nhưng nó sẽ cho phép bạn nhập 8 chữ số trước số thập phân và 2 chữ số sau số thập phân

các câu trả lời khác chỉ chấp nhận 8 chữ số

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.