【问题标题】:How to check phone numbers on c#?如何在c#上查看电话号码?
【发布时间】:2017-01-31 16:22:24
【问题描述】:

我的目标是查看用户是否输入了一次有效的电话号码。如果没有,我只是告诉他们这是错误的。我看过How to format a string as a telephone number in C# 和其他一些,但我仍然不确定。

我需要做的是确保用户输入一个有效的数字,这意味着 1) 它只能是数字 2) 破折号必须在正确的位置以及 3) 它的字符数量是正确的。

我做了第三个。数字 1 应该只是一个 TryParse 验证。我主要是在弄清楚数字 2。上述问题是否正确:

string phone = i["MyPhone"].ToString();
string area = phone.Substring(0, 3);
string major = phone.Substring(3, 3);
string minor = phone.Substring(6);
string formatted = string.Format("{0}-{1}-{2}", area, major, minor);

现在,这显示 .Format。我认为我不需要这样做,因为我只应该验证数字是否格式正确,而不是实际将数字放在破折号之间。

所以,最终结果将是 请输入号码:123-456-7890 恭喜这个号码有效

请输入号码:123-45-45-4 此号码无效。

避免使用正则表达式解决方案,并且数字不必是真实的。只要符合上述格式即可。

【问题讨论】:

  • 查看正则表达式
  • 嗯,作为程序员,我们的工作是让人们使用软件的生活更轻松,你确定没有其他方法可以不强制用户输入“-”作为电话号码?你通常是这样写下你的号码还是在他们要求时将其发送给某人?我认为与其强迫用户在电话号码中使用“-”,不如提出一个更好的设计。
  • 请考虑国际号码,例如 +155512345678 表示美国号码。这不像在正确的位置检查破折号那么简单。让人们输入自己的格式,也许检查最少的位数。
  • 我不能使用正则表达式 不要担心这个数字是实际数字。只要符合 xxx-xxx-xxxx 格式即可。

标签: c# validation substring phone-number tryparse


【解决方案1】:

即使您不使用正则表达式引擎,使用模式也会有所帮助。例如,一个数字是有效的,“如果它在与模式相同的位置有数字并且非数字完全相同”可以这样编码:

bool IsPhoneNumber(string input, string pattern)
{
     if (input.Length != pattern.Length) return false;

     for( int i = 0; i < input.Length; ++i ) {
         bool ith_character_ok;
         if (Char.IsDigit(pattern, i))
             ith_character_ok = Char.IsDigit(input, i);
         else
             ith_character_ok = (input[i] == pattern[i]);

         if (!ith_character_ok) return false;
     }
     return true;
}

现在您甚至可以检查多个模式,例如

if (IsPhoneNumber(input, "000-000-0000") || IsPhoneNumber(input, "(000) 000-0000"))

但它也可以用于匹配其他事物,例如,000-00-0000 模式用于社会安全号码。

【讨论】:

    【解决方案2】:
    List<string> phoneNumbers = new List<string> {"111-111-1111",
                                                 "1-111-111-1111",
                                                 "111111-1111",
                                                 "111-1111111",
                                                 "(111)111-1111",
                                                 "(111) 111-1111",
                                                 "11111111111",
                                                 "111111-11111",
                                                 "1111111111111"};
    
    foreach(string phoneNumber in phoneNumbers)
    {
        Match match = Regex.Match(phoneNumber,@"^\s*(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?\s*$", RegexOptions.IgnoreCase);
    
        Console.WriteLine(phoneNumber + " " + match.Success);
    }
    
    
    //111-111-1111   True
    //1-111-111-1111 True
    //111111-1111    True
    //111-1111111    True
    //(111)111-1111  True
    //(111) 111-1111 True
    //11111111111    True
    //111111-11111   False
    //1111111111111  True
    

    【讨论】:

      【解决方案3】:
         bool wrong = true;
      
              while (wrong)
              {
                  string phoneNumber = Console.ReadLine();
                  string[] values = phoneNumber.Split('-');
                  while (string.IsNullOrWhiteSpace(phoneNumber))
                  {
                      Console.WriteLine("Invalid - Please do not leave blank");
                  }
      
                  if (values.Length == 3 && values[0].Length == 3 && values[1].Length == 3 && values[2].Length == 4)
                  {
                      int yesnumber;
                      List<int> intvalues = new List<int>();
                      for (int number = 0; number < values.Length; number++)
                      {
                          bool isNumeric = Int32.TryParse(values[number], out yesnumber);
                          if (isNumeric == true)
                          { intvalues.Add(yesnumber); }
                      }
                      if(intvalues.Count == 3)
                      {
                          Console.WriteLine("Congratulations This is a valid number");
                          break;
                      }
      
                      else { Console.WriteLine("This is not a valid number"); }
                  }
      
                  else { Console.WriteLine("This is not a valid number"); }
              }
              Console.ReadLine();
          }
      

      这适用于简单的控制台应用程序,但它适用于要求用户以特定格式拥有您要求的所有内容。

      编辑* 我修复了不检查数字的错误。

      【讨论】:

      • 那会很乐意接受ABC-DEF-GHIJ,因为尽管您测试了这些部分是否解析为整数,但您忽略了该测试的结果。
      • edit你的答案解释其中的代码是如何工作的。
      • 不正是我所要求的,但它有效!谢谢!
      • 我要如何才能做到只能使用数字?
      • 我修正了号码检查。有时间我也会编辑解释一下。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多