【问题标题】:Checking for valid mobile number in android在android中检查有效的手机号码
【发布时间】:2013-05-15 04:40:46
【问题描述】:

我目前正在注册一个安卓应用程序。我想捕获在 EditText 框中输入的无效手机号码。单击提交按钮后,应用程序将检查输入的手机号码是否有效。

所有有效号码都应以"639" 开头。我的问题是如何读取用户输入的前三位数字?例如,用户输入639158716271,这是一个有效数字。而197837281919 无效。

谁能建议如何做到这一点?

提前致谢!

【问题讨论】:

  • 有一个不错的单行解决方案。看我的回答。

标签: java android


【解决方案1】:
     //Get the string from the edit text by:
     String number = yourEditText.getText().toString();

     if(number != null && number.matches("639[0-9]{9}"))
     //do what you need to do for valid input
     else
     //do what you need to do for invalid input

matches() 确保整个字符串(准确地)与它所采用的正则表达式相一致。 639[0-9]{9} 表示字符串必须以 639 开头,然后紧跟 9 位数字 (0-9)。例如,如果您想匹配 "639" 后跟 7 到 9 个数字,您可以使用:639[0-9]{7,9}。正则表达式:http://docs.oracle.com/javase/tutorial/essential/regex/

【讨论】:

  • 我很确定匹配已内置到 java 的字符串处理函数中,因此您不需要使用 Pattern,您可以使用 number.matches("639[0-9]{9}" )
  • “正则表达式很棒”这句话很有争议,人们需要了解正则表达式何时合适,何时不合适。不要仅仅因为可以使用正则表达式,而是使用它来简化工作。
  • 随时将您的意见添加到答案中,意见总是受欢迎的,意见只是批评的开端:)
【解决方案2】:

方法一:

获取 EditText 的一个实例:

EditText myEdit = (EditText) findViewById(R.id.edittext1);

然后获取当前正在显示的字符串:

String phoneNumber = myEdit.getText().toString();

如果你想匹配的只是它的初始数字,那么你可以按如下方式进行比较:

String initialPart = phoneNumber.substring(0, 4);  
//Get 1st three characters and then compare it with 639
boolean valid = initialPart.equals("639");

然后您可以继续进行其他比较。但是,这种方法容易出错,您可能会错过一些极端情况。所以我建议选择方法2:

方法:2

不过,另一种非常好的方法是使用 Google 的 libphonenumber。文档说:

It is for parsing, formatting, storing and validating international phone numbers. The Java version is optimized for running on smartphone.

我用它来验证电话号码。它非常易于使用,您不需要照顾角落的情况。它考虑了您的国家/地区以及用户可能输入的各种格式。它检查该号码是否对该地区有效。它还处理用户可能输入的所有可能的有效格式,例如: "+xx(xx)xxxx-xxxx", "+x.xxx.xxx.xxx","+1(111)235-READ" ,"+1/234/567/8901", "+1-234-567-8901 x1234"(这里 x 是数字)。

以下是如何验证它的示例用法:

PhoneNumber NumberProto = null;
String NumberStr = "639124463869"
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
try {
  NumberProto = phoneUtil.parse(NumberStr, "CH"); 
} catch (NumberParseException e) {
  System.err.println("NumberParseException was thrown: " + e.toString());
}
boolean isValid = phoneUtil.isValidNumber(NumberProto); // returns true or false

P.S:"CH" 是瑞士的国家代码。您可以根据需要输入您的国家/地区代码。他们被给予here。希望能帮助到你。

【讨论】:

  • 它会给出一个false作为响应,即一个无效的数字。你可以在这里尝试一下:libphonenumber.appspot.com
  • Yaa,为此我刚刚开始回答并想展示进一步比较的路径。如果此人不想使用该库,则可以使用您的答案进行检查。我给出了一个更通用的答案,它适用于所有场景,给定任何电话号码。它可能会帮助其他人,如果不是问的人。
【解决方案3】:
<EditText
                android:id="@+id/EditText"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="number"
                android:maxLength="12"
                 />

    int number = Intiger.ParseInt(EditText.getText.toString());

    if(number.startsWith("639")&& number.length == 12) 
    {
        //valid
    }
    else
    {
        //invalid
    }

【讨论】:

    【解决方案4】:

    编辑:这是一个更长的解决方案。如果您真正需要的是验证史蒂夫指出的数字,那么正则表达式是缩短代码的方法。

    ===

    首先,限制您的 EditText 只接受数字,然后您可以使用以下内容来验证数字的有效性。

    public static final int NUMBER_LENGTH = 9; // This will be used for validation
    
    /**
     * Returns the prefix of a phone number
     */
    public String getNumberPrefix(String number) {
        if (number != null) {
            if (number.length() > NUMBER_LENGTH) {
                return number.substring(0, number.length() - NUMBER_LENGTH);
            }
        }
        return "";
    }
    
    /**
     * Checks if a phone number is valid based on length and prefix
     */
    public boolean isValidNumber(String number, String prefix) {
        if (prefix == null) {
            prefix = "";
        }
        if (number != null) {
            if (number.length() > 0) {
                if ((number.length() == NUMBER_LENGTH + prefix.length()) && (getNumberPrefix(number).equals(prefix))) {
                    return true;
                }
            }
        }
        return false;
    }
    

    所以在你的情况下,你可以设置一个常数长度:

    使用该方法的一些例子:

    isValidNumber("639158716271", "639"); // This will return true
    isValidNumber("631111111111", "639"); // This will return false
    isValidNumber("6391587", "639"); // This will return false
    isValidNumber("123456789000", "639"); // This will return false
    

    【讨论】:

    • 好点,但就我而言,我将 EditText 限制为仅接受数字。
    【解决方案5】:

    您可以在字符串对象中使用startsWith 方法:

    String num = "639158716271"
    if (num.startsWith("639") && num.length() == 12)
      // valid
    else
      // invaid
    

    【讨论】:

    • 如果639后面有无效的东西怎么办?
    • 你是正确的史蒂夫,但在接受电话号码时,我们可以限制编辑文本只接受数字,这个解决方案可以正常工作。我想限制用户只输入数字比允许他输入其他字符然后签入代码更好。如果我错了,请纠正我。
    【解决方案6】:

    检查 android 中的有效手机号码强文本 添加您的 XML 编辑文本

                android:maxLines="1"
                android:maxLength="10"
                android:inputType="number"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2017-10-27
      • 2013-12-14
      • 2011-11-16
      • 2011-06-27
      • 1970-01-01
      相关资源
      最近更新 更多