2017-04-05 41 views
-4

我目前正在学习考试,而我正在尝试编写一个类,我看到了这个需求的属性。我需要在名为User的类中编写此属性。在C中格式化属性#

电话 - 必须在格式“+ [COUNTRY_CODE]/[电话]”,其中 [COUNTRY_CODE]为1个3位和[电话]之间是数字8 和10之间。

  • 有效电话:+123/88888888,+1/1234579284

  • 无效电话:-123/88888888,+4分之1235 4444444,123348585313, 123 \ 34553363587

我是否使用[RegularExpression()]ComponentModel.DataAnnotations还是别的?

+0

请阅读[问]。重要短语:“搜索和研究”和“解释......阻止你自己解决它的任何困难”。 –

回答

0

我认为这个代码你想要做什么:

private string _phone; 
public string Phone 
{ 
    get 
    { 
     return _phone; 
    } 
    set 
    { 
     int indexOfSlash = value.IndexOf("/"); 

     if (value.Length > 13 || indexOfSlash > 4 || indexOfSlash < 2 || value[0] != '+') 
      throw new Exception("Wrong format"); 

     for (int i = 1; i < value.Length; i++) 
     { 
      if ((i < indexOfSlash || i > indexOfSlash) && !value[i].IsDigit()) 
       throw new Exception("Wrong format"); 
     } 

     _phone = value; 
    } 
} 
+0

这段代码是一个很好的例子,说明为什么使用正则表达式是合理的:一旦你熟悉语法,它们比这样的代码更好的阅读和维护。 你可以简化这个代码: indexOfSlash> 4 || indexOfSlash < 2 => indexOfSlash!= 3 i indexOfSlash => i!= indexOfSlash 此外,如果电话号码是空字符串,则代码会崩溃。 –

0

你可以在电话setter方法需要使用正则表达式。

^\+\d{1,3}\/\d{8,10}$ 

打破下来:

  • ^:仅匹配字符串的开头。
  • \+:匹配+,这需要被转义。
  • \d{1,3}:匹配1至3次的任何数字(0-9)。
  • \/:匹配/,这需要转义。
  • \d{8,10}:匹配从8到10次的任何数字(0-9)。
  • $:仅在字符串末尾匹配。

示例代码:

private static Regex phoneRegex = new Regex(@"^\+\d{1,3}\/\d{8,10}$", RegexOptions.Compiled); 

private string phone; 
public string Phone { 
    get { return phone; } 
    set { 
     Match match = phoneRegex.Match(value); 
     if (match.Success) { 
      phone = value; 
     } else { 
      throw new ArgumentException("value"); 
     } 
    } 
}