【问题标题】:Validation for a cell number in Android在 Android 中验证手机号码
【发布时间】:2011-05-11 02:44:23
【问题描述】:

我有一个用户界面,用户在其中输入单元格编号,该编号存储在字符串变量中,然后存储到数据库中。

我想验证字符串以检查字符串是否不包含任何字符。

我该怎么做?

下面是字符串代码。

EditText editText3 = (EditText) this.findViewById(R.id.editText2);
setNum = editText3.getText().toString(); //setNum would contain something link 8081124589

【问题讨论】:

  • 根据定义,所有字符串都包含 字符,但 null 或空字符串除外。你的意思是字母吗?或者可能是特殊字符,例如-.() /?或者任何不是数字的字符?

标签: android string validation


【解决方案1】:

要验证字符串,请使用

if (setNum.matches(regexStr))

regexStr 可以是:

//matches numbers only
String regexStr = "^[0-9]*$"

//matches 10-digit numbers only
String regexStr = "^[0-9]{10}$"

//matches numbers and dashes, any order really.
String regexStr = "^[0-9\\-]*$"

//matches 9999999999, 1-999-999-9999 and 999-999-9999
String regexStr = "^(1\\-)?[0-9]{3}\\-?[0-9]{3}\\-?[0-9]{4}$"

在美国有一个很长的正则表达式来验证电话(7 到 10 位数字,允许分机等)。来源来自这个答案:A comprehensive regex for phone number validation

String regexStr = "^(?:(?:\\+?1\\s*(?:[.-]\\s*)?)?(?:\\(\\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\\s*\\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\\s*(?:[.-]\\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\\s*(?:[.-]\\s*)?([0-9]{4})(?:\\s*(?:#|x\\.?|ext\\.?|extension)\\s*(\\d+))?$"

【讨论】:

  • 对我来说看起来不错,尽管您可能希望在较短的模式中允许括号、点和空格。我自己通常把美国的电话号码写成(234) 567-8900。长正则表达式非常可怕,可能有点限制,但它对我来说确实非常全面。不过,您在结尾处有一些未转义的反斜杠。
  • 我要注意的一件事是国际号码,它可以是几种不同的格式和长度。如果你能找到它,你可以考虑查找 Skype 用于将数字转换为超链接的正则表达式。
  • @Justin 感谢您的关注。转义反斜杠是我对“可怕”正则表达式的唯一补充,它不完整:/我将等待 OP 回复,看看他是否需要任何其他模式。
【解决方案2】:

API 8 级或以上:

public static final boolean isValidPhoneNumber(CharSequence target) {
    if (target == null || TextUtils.isEmpty(target)) {
        return false;
    } else {
        return android.util.Patterns.PHONE.matcher(target).matches();
    }
}

【讨论】:

  • 这是最好的解决方案(或使用 PhoneNumberUtils.isGlobalPhoneNumber)。一个小调整,检查 target == null 是不必要的,因为 TextUtils.isEmpty 会为您处理检查。
  • 完美的一个!!帮了我很多
  • 阅读源代码的 cmets: /** * 此模式旨在搜索看起来像 * 可能是任意文本中的电话号码的东西,而不是用于验证 * 某物是否真的是电话数字。它会遗漏许多 * 是合法电话号码的东西。 * 因此,这不是最好的解决方案~
  • @shanwu 如果您想在 EditText 等输入字段中允许多个样式的电话号码,可以使用此模式。您是对的,因为这不是对无需任何修改即可拨打(拨打)的确切电话号码的验证。
【解决方案3】:

如果你只是想测试它是否是一个数字,你可以尝试{Integer.parseInt(setNum);继续} catch (Exception e) {oops not a number}

或 Double.parseDouble(setNum);取决于您期望的数字类型。

或者您可以先删除空格,然后执行上述操作。

或者您可以使用正则表达式,但这可能有点矫枉过正。

但也许您应该首先限制编辑文本中允许的字符。例如,在 xml 文件中,您可以添加属性 android:digits="0123456789-()"。

如果您尝试获取安装应用的设备的电话号码,您也可以尝试预填充电话号码:

TelephonyManager tMgr =(TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE);
  mPhoneNumber = tMgr.getLine1Number();

并使用权限 android:name="android.permission.READ_PHONE_STATE"。

请注意,这并不总是有效(请参阅Programmatically obtain the phone number of the Android phone

【讨论】:

  • 与查询 TelephonyManager 相比,您真的认为正则表达式字符串是多余的吗?
  • 查询telephymanager实际上只是一个想法,因为他试图获取安装了他的应用程序的电话号码并为他的用户群预加载它。它实际上与数字验证没有直接关系,只是给了他一些想法。我实际上认为最好的办法就是限制用户可以输入的字符。
  • 我认为限制用户可以输入的字符绝对是最好的方法,如果可以的话。
  • 我同意这一点。限制输入是最好的方法。我不知道它是否可以在他的应用程序中受到限制,或者它是否会成为更大字符串的一部分。
【解决方案4】:

我喜欢使用PhoneNumberUtils。具体来说 - formatNumber(String num, String defaultCountryIso)formatNumber(); 将在尝试格式化后返回 null 如果它是无效数字。否则,它将返回格式化的字符串。

例子:

 EditText editText3 = (EditText) this.findViewById(R.id.editText2);
 String setNum;

 if(!TextUtils.isEmpty(editText3.getText()){
      setNum = editText3.getText.toString();

      /* format with PhoneNumberUtils */
      TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
      String mCountryCode = telephonyManager.getNetworkCountryIso();

      // I like to check for sdk cause less than 21 won't support default country code
      if (android.os.Build.VERSION.SDK_INT >= 21) {
          setNum = PhoneNumberUtils.formatNumber(phoneNumber, mCountryCode);
       } else {
          // this one is deprecated
          setNum = PhoneNumberUtils.formatNumber(phoneNumber);
       }

      // if setNum is not null, you now have a valid formatted number
      if(setNum != null){
         return true;
      } else {
         editText3.setError("Invalid phone number");
         Log.d(TAG, "Invalid phone number: " + setNum); 
         return false;
      }
 } else {
    return false;
 }

另外,您可能需要 TelephonyManager 的权限 [不太确定?需要链接]。如果是这样,请将其添加到清单中:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

【讨论】:

    【解决方案5】:

    您可以使用一个正则表达式,就像已经说明的回复者之一。要将违规消息路由到组件,可以使用 setError 消息;

    TextView v = (TextView) view;
    setError(message);
    

    这是标记有错误的 UI 组件的标准技术。它已在 BARACUS Framework for Android 应用程序中得到利用,以便在 android 中拥有 declarative form validation

    由于这些东西是 Apache 2 许可的,请随时 verbatim the code

    【讨论】:

      【解决方案6】:

      您可以使用正则表达式模式来验证电话号码格式。

      考虑到有关电话号码格式的这些事实:-

      1. 国家/地区代码前缀以“+”开头,有 1 到 3 位数字
      2. 号码的最后一部分,也称为订户号码,是所有号码中的 4 位数字
      3. 大多数国家/地区的电话号码在不包括国家/地区代码后都有 10 位数的电话号码。一般的观察结果是,所有国家/地区的电话号码在排除国家/地区代码后都介于 8 到 11 位之间。
      String allCountryRegex = "^(\\+\\d{1,3}( )?)?((\\(\\d{1,3}\\))|\\d{1,3})[- .]?\\d{3,4}[- .]?\\d{4}$";
      

      让我们打破正则表达式并理解,

      • ^ 表达式开始
      • (\\+\\d{1,3}( )?)? 是 1 到 3 位数字之间的可选国家代码匹配,前缀为“+”符号,后跟空格或不带空格。
      • ((\\(\\d{1,3}\\))|\\d{1,3} 是 1 到 3 位数字的强制组,带或不带括号,后跟连字符、空格或不带空格。
      • \\d{3,4}[- .]? 是由 3 位或 4 位数字组成的强制组,后跟连字符、空格或无空格
      • \\d{4} 是最后 4 位的必填组
      • $ 表达式结束

      此正则表达式模式匹配大多数国家/地区的电话号码格式,包括:-

              String Afghanistan      = "+93 30 539-0605";
              String Australia        = "+61 2 1255-3456";
              String China            = "+86 (20) 1255-3456";
              String Germany          = "+49 351 125-3456";
              String India            = "+91 9876543210";
              String Indonesia        = "+62 21 6539-0605";
              String Iran             = "+98 (515) 539-0605";
              String Italy            = "+39 06 5398-0605";
              String NewZealand       = "+64 3 539-0605";
              String Philippines      = "+63 35 539-0605";
              String Singapore        = "+65 6396 0605";
              String Thailand         = "+66 2 123 4567";
              String UK               = "+44 141 222-3344";
              String USA              = "+1 (212) 555-3456";
              String Vietnam          = "+84 35 539-0605";
      

      来源:https://codingnconcepts.com/java/java-regex-for-phone-number/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-14
        • 2017-02-06
        • 1970-01-01
        • 1970-01-01
        • 2013-12-01
        • 2013-07-01
        • 2013-12-20
        • 2018-03-02
        相关资源
        最近更新 更多