【问题标题】:How to determine if an input in EditText is an integer?如何确定 EditText 中的输入是否为整数?
【发布时间】:2012-04-24 14:24:49
【问题描述】:

您好,我是 Android 编程的新手。

我正在尝试构建一个包含edittext 字段和button 的活动。当用户输入一个整数时,按钮将引导他们进入下一个活动。但是,如果有办法检查用户输入的类型,我不会。

有人可以帮助我吗?非常感谢!

【问题讨论】:

  • 我在网上找到一行代码:
  • myEdit.getText().getClass().equals(Integer.TYPE) /// 但是,在玩了我的代码之后,我发现edittext实际上返回了一个可编辑的数据类型
  • 你可以使用TextWather获取用户在EditText中输入的内容,你试过吗?
  • 而且我不知道如何检查输入的类型。 1 是否表示为字符串?字符序列?诠释?
  • 你好亨利,在查阅了TextWatcher的文档后,我相信它不能解决我的问题,因为它是用来监视可编辑的文本变化的。不过还是谢谢你!

标签: android validation android-edittext


【解决方案1】:

从 API 级别 1 开始,Android 提供了一个辅助方法来做到这一点(无需使用正则表达式或捕获异常):TextUtils.isDigitsOnly(CharSequence str)

boolean digitsOnly = TextUtils.isDigitsOnly(editText.getText());

请注意,此方法返回 true 并带有空字符串:Issue 24965

【讨论】:

  • 对于像 0.25 这样的浮点数,这将返回 false
  • :(卡在Note that this method returns true with empty String : Issue 24965
【解决方案2】:

更新:

你可以控制 EditText 只接受数字

<TextView 
.
.
.
android:inputType="number"
/>

或以编程方式检查

在 Kotlin 中

val number = editText123.text.toString().toIntOrNull() 
val isInteger = number != null

在 Java 中

String text = editText123.getText().toString();
try {
   int num = Integer.parseInt(text);
   Log.i("",num+" is a number");
} catch (NumberFormatException e) {
   Log.i("",text+" is not a number");
}

【讨论】:

  • 值得指出的是,任何大于Integer.MAX_VALUE 的数字都将返回 false。如果您想检查输入是否仅包含数字,正确答案是 TextUtils.isDigitsOnly(CharSequence str)。
  • try-catch 总是存在性能开销。这就是建议避免异常捕获的原因。
  • 你的意思是 EditText 而不是 TextView
【解决方案3】:

如果您希望 EditText 只接受数字,则不能在布局文件中指定 android:inputType="number"

【讨论】:

  • 更好、更简洁、更符合逻辑的方法。 android:inputType 也有助于根据 UX 设置各种过滤器。
  • 但是用户可以将文本粘贴到Edittext中,这可能会导致NumberException崩溃
  • @CWilliams EditText 和android:inputType="number" 将只接受粘贴时的数字。因此,如果用户粘贴Some123Text,则只会粘贴123
【解决方案4】:

您可以使用TextWatcher for EditText 来获取EditText 中每个更改的值。您需要在Activity 中添加TextWatcher 的接口。

 mEditText.addTextChangedListener(Your Class Name.this);

在TextWatcher的方法中

     @Override
public void afterTextChanged(Editable s) {
    Log.v("Log_tag", "After TextChanged" + s.toString());

}

@Override
public void beforeTextChanged(CharSequence s, int start, int count,
        int after) {
    Log.i("Log_tag", "Before TextChanged" + s.toString());

}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    Log.e("Log_tag", "ontext Changed" + s.toString());
    //you can match here s with number or integer 
             if(isNumeric( s.toString())){
                      //it is number     
               }
    }


 public static boolean isNumeric(String str)
 {
    return str.matches("-?\\d+(.\\d+)?");
  }

【讨论】:

  • 您好,感谢您向我介绍这种不可思议的方法。我相信这将是我未来的用途!谢谢你:D
【解决方案5】:

以下代码可用于确定数字,

boolean isDigits = TextUtils.isDigitsOnly(edtDigits.getText().toString());

但是,由于此方法也使用空字符串返回 true,因此您可以按如下方式对空字符串进行验证,

public boolean isDigits(String number){ 
   if(!TextUtils.isEmpty(number)){
       return TextUtils.isDigitsOnly(number);
   }else{
       return false;
   }
}

【讨论】:

    【解决方案6】:

    试试这个解决方案。

    您需要添加属性android:nextFocusDown="@+id/nextedittext_id"android:singleLine="true" 在您的编辑文本中。

    例如:

    <EditText
            android:id="@+id/ed1"
            android:layout_width="200dp"
            android:nextFocusDown="@+id/ed2"
             android:singleLine="true"
            android:layout_height="wrap_content" />
    
    
     <EditText
            android:id="@+id/ed2"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:layout_below="@+id/ed1" />
    

    并在您的活动中添加以下代码:

     editText1.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) {
                    String value=s.toString();
                        if(isNumeric(value)){
                            if(Integer.parseInt(value)>=100){
                                editText1.setFocusableInTouchMode(true);
                                editText1.setFocusable(false);
                            }
                    }
                }
    
                @Override
                public void afterTextChanged(Editable s) {
                }
            });
            editText2.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                    editText1.setFocusableInTouchMode(true);
                    editText1.setFocusable(true);
                }
    
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
    
                }
    
                @Override
                public void afterTextChanged(Editable s) {
    
                }
            });
    

    isNumeric 方法同上:

     public static boolean isNumeric(String str)
        {
            return str.matches("-?\\d+(.\\d+)?");
        }
    

    【讨论】:

      【解决方案7】:

      我找到了一个更简洁的解决方案,它检查字符串是否是任何类型的数字,包括 integerfloatlongdouble

      import java.math.BigDecimal;
      
      Boolean isNumber;
      
      try {
          BigDecimal n = new BigDecimal(theStingToCheck);
          isNumber = true;
      } catch (Exception e) {
          isNumber = false;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-20
        • 1970-01-01
        • 2016-05-19
        相关资源
        最近更新 更多