测试C#中的电话号码

测试C#中的电话号码

问题描述:

我有一个奇怪的问题,我使用下面的代码来测试电话号码,在我的测试中我的代码工作正常。该程序在昨天直播,有人使用电话号码08720 123 456,我的代码失败。你能告诉我为什么它会返回TRUE为0161 287 1234和FALSE为08720 123 456?测试C#中的电话号码

传真号码1:0161 287 1234 ---> ISNUMBER返回TRUE 传真号码2:08720 123 456 ---> ISNUMBER返回FALSE

static bool IsNumber(string value) 
     { 
      // Return true if this is a number. 
      int number1; 
      return int.TryParse(value, out number1); 
     } 

bool testForFax = IsNumber(faxOrEmail); 
      if (testForFax == true) 
      { 
       backgroundWorker2.RunWorkerAsync(); //send fax 
      } 
      else 
      { 
       MessageBox.Show("Please enter a fax number."); 
      } 
+2

谁是史蒂夫和你为什么要感谢他? – Default 2012-01-13 10:43:13

+0

[电话号码验证综合正则表达式]的可能重复(http://*.com/questions/123559/a-comprehensive-regex-for-phone-number-validation) – 2012-01-13 10:49:27

int可以取的值的范围是从负2147483648通过积极2147483647。

0161 287 1234在该范围内,08720 123 456不是。

你不应该这样解析一个电话号码 - 它不是,从数学上讲,一个数字(你能以一种有意义的方式加法/减法的电话号码?)。

你应该使用regular expression验证。

+0

这就是答案,你的08 ........数字要大到适合int,你可能需要使用一个int64 – Moonlight 2012-01-13 10:46:05

+1

@Moonlight - 不,他不会使用一个转换为一个整数键入以测试有效的电话号码。 – Oded 2012-01-13 10:51:47

+0

为他使用的方法,他需要一个int64而不是int32。我不建议这是最好的/最好的方式来做到这一点 – Moonlight 2012-01-13 11:04:29

int.TryParse方法试图解析整数不电话和传真。你不能只是抛出任何字符串,并期望得到一个整数。如果您希望将其成功解析为整数,则字符串中不应有任何空格。

两个字符串返回false:

class Program 
{ 
    static void Main() 
    { 
     Console.WriteLine(IsNumber("0161 287 1234")); // false 
     Console.WriteLine(IsNumber("08720 123 456")); // false 

     Console.WriteLine(IsNumber("01612871234")); // true 
     Console.WriteLine(IsNumber("0872")); // false because you overflowed Int32 which can store a maximum value of 2147483648 
    } 

    static bool IsNumber(string value) 
    { 
     int number1; 
     return int.TryParse(value, out number1); 
    } 
} 

因此,为了验证,你可以使用正则表达式的电话号码。

+0

当然,电话号码只是一个数字时空间被删除? – 2012-01-13 10:45:55

+0

@SteveWood是的,它可以归结为一个数字,但不是每个数字都可以是一个电话号码 - 它具有结构。 – 2012-01-13 10:47:34

+0

@SteveWood,不,因为您只能在Int32类型中存储有限数字。看我的例子。 – 2012-01-13 10:48:11

你可以去掉空格并检查数字。

使用正则表达式可能是另一个不错的选择。

因为08720 123 456超过了整数的最大值。这是最大值:2,147,483,647。

不要使用int.TryParse,但使用正则表达式来检查,如果该值是一个电话号码。

+0

好的谢谢,这解释了它。 – 2012-01-13 10:46:27

一个Ints范围是-2,147,483,648到2,147,483,647。所以0161 287 1234,将被正确解析为1612871234,而08720 123 456超出范围并且不会被解析。所以我建议你使用RegEx来匹配一个字符模式或其他东西。

的整数的最大值为2147483647,你的第二数量超过该值。

这个怎么样?

string number = "08720 123 456"; 

bool testForFax = number.All(c => Char.IsNumber(c) || Char.IsWhitespace(c)) 

public static bool IsFaxNumber(string faxNo) 
    { 
     bool returnValue = false; 
     var items = faxNo.Split(' '); 
     if (faxNo.Length == 13 && items.Length == 3) 
      if (items[0].Length == 4 && items[1].Length == 3 && items[2].Length == 4) 
       returnValue = true; 
     return returnValue; 

    }