如何使EditText只接受小数点后两位数字

3
我正在尝试在EditText中添加仅有两个小数点后的数字。
因此,我实现了一个TextWatcher来检查输入期间的string
下面使用的函数非常好用,但有一个重大缺陷。当您输入任何值,然后添加小数点,删除该小数点并继续添加更多值时,只有三个值被接受为输入。
例如:我输入300.,但随后意识到我想输入3001234567,因此我删除了小数点.并继续添加1234567300,只有123被接受,其余部分被忽略。
如何处理这种情况?任何建议将不胜感激。
我的代码:
 price.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 = price.getText().toString();
             price.setOnKeyListener(new View.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);
                         price.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());
                     price.setFilters(fArray);
                     //prevent the edittext from accessing digits
                     //by setting maximum length as total number of digits                               we typed till now.
                 }
                  count++;
              }
          }
      }
  });

2
可能是重复的问题:如何让EditText只显示两位小数 - Rohit5k2
你可能不应该过于匆忙地标记重复项,而是要先审查两种情况。 - Steve Kamau
我已经审核了两个。如果您删除这个长的“if-else”块,那么可以完全应用此用途。 - Rohit5k2
@greenapps 是的,数字。 - Steve Kamau
@Rohit5k2 你试过你链接的东西吗?我认为,给出的答案不够充分。它是不完整的,并且不能直接使用。此外,这种情况有点更加复杂。我不会将其标记为重复。 - AlbAtNf
显示剩余3条评论
1个回答

4

试试这个:

@Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
             String input = s.toString();
            if(input.contains(".") && s.charAt(s.length()-1) != '.'){
                if(input.indexOf(".") + 3 <= input.length()-1){
                    String formatted = input.substring(0, input.indexOf(".") + 3);
                    editReceiver.setText(formatted);
                    editReceiver.setSelection(formatted.length());
                }
            }else if(input.contains(",") && s.charAt(s.length()-1) != ','){
                if(input.indexOf(",") + 3 <= input.length()-1){
                    String formatted = input.substring(0, input.indexOf(",") + 3);
                    editReceiver.setText(formatted);
                    editReceiver.setSelection(formatted.length());
                }
            }
        }

请注意,德国的小数点是以逗号“,”分隔,而不是句点“.”分隔。如果没有必要,您可以删除else部分。

另一个问题是,如何限制只能输入一个小数点? - Steve Kamau
2
没关系,我已经用mEditText.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);完成了。 - Steve Kamau
1
类似https://developer.android.com/reference/java/text/DecimalFormat.html这样的类可以让您动态获取地区,然后根据地区使用适当的“小数点”和“千位分隔符”,例如“。”和“,”或“,”和“。”。这样,您就不必像在此处一样硬编码字符(更具适应性)。 - mawalker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接