格式化字符串/电话号码

问题描述:

我想使用C#格式化电话号码。格式为(XX)YYY-ZZZZ或(XXX)YYY-ZZZZ。所以,我需要 来格式化右边的七位数字,然后剩下的两个或三个地区代码。格式化字符串/电话号码

{编辑}

电话被保存为一个纯字符串/长度9的VARCHAR或10

请提出的解决方案。

谢谢。

+0

你是如何存储的电话号码? – CodeNaked 2011-05-26 17:44:02

+0

这可能是一个字符串。那么正则表达式或拼图就有可能。 – ibram 2011-05-26 17:47:28

+0

as plain string – DotnetSparrow 2011-05-26 17:47:58

是电话号码存储为字符串或数字值。如果它保存为一个整数值,这个应该这样做:

string formattedPhone = rawNumber.ToString("(#00) 000-0000") ; 

如果它被存储为一个字符串,你需要看的长度和开始砍伐它,这样的:

static string FormatAsPhoneNumber(string s) 
{ 
    if (s == null) throw new ArgumentNullException() ; 
    if (s.Length > 10) throw new ArgumentOutOfRangeException() ; 

    StringBuilder sb = new StringBuilder() ; 
    int   p = 0 ; 
    int   remaining = s.Length ; 

    if (remaining > 7) 
    { 
    int areaCodeLength = remaining - 7 ; 

    sb.Append("(").Append(s.Substring(p,areaCodeLength)).Append(") ") ; 

    p   += areaCodeLength ; 
    remaining -= areaCodeLength ; 

    } 
    if (remaining > 4) 
    { 
    int exchangeLength = remaining - 4 ; 

    sb.Append(s.Substring(p,exchangeLength)).Append("-") ; 

    p   += exchangeLength ; 
    remaining -= exchangeLength ; 

    } 

    sb.Append(s.Substring(p)) ; 

    string formatted = sb.ToString() ; 
    return formatted ; 
} 

结果:

Raw   Formatted 
---------- -------------- 
1   1 
12   12 
123  123 
1234  1234 
12345  1-2345 
123456  12-3456 
1234567 123-4567 
12345678 (1) 234-5678 
123456789 (12) 345-6789 
1234567890 (123) 456-7890 
+0

是的,它被存储为字符串。 – DotnetSparrow 2011-05-26 18:07:28

假设的电话号码存储作为一个长期的,并且是9或10个数字,你可以这样做:

if (number > 999999999L) 
{ 
    return String.Format("{0:(###) ###-####}", number); 
} 
else 
{ 
    return String.Format("{0:(##) ###-####}", number); 
} 

当然这仅在数正好是9或10位长的工作。

如果我理解正确,您需要一个接收int的函数,并返回带有该格式的fone号码的string。如果是这样,你可以做这样的事情:

public string GetPhoneNumber(int number) { 
    string n = number.ToString(); 
    if (n.Length == 9) 
     return "(" + n.Substring(0, 2) + ") " + n.Substring(2, 3) + "-" + n.Substring(5, 4); 
    else 
     return "(" + n.Substring(0, 3) + ") " + n.Substring(3, 3) + "-" + n.Substring(6, 4); 
} 

这将需要任何字符串和从右侧位置到第一10个号码开始到

(?xxx)xxx-xxxx

格式化字符串。

public string FormatPhone(string input) 
    { 
     List<char> chars = new List<char>(); 
     if (input.Length < 9) throw new ArgumentException("Not long enough!"); 
     for (int i = input.Length - 1; i >= 0; i--) 
     { 
      if (Char.IsNumber(input[i])) chars.Add(input[i]); 
      switch (chars.Count) 
      { 
       case 4: 
        chars.Add('-'); 
        break; 
       case 8: 
        chars.Add(' '); 
        chars.Add(')'); 
        break; 
       case 13: 
        i = 0; 
        break; 
      } 
     } 
     chars.Add('('); 
     chars.Reverse(); 
     return new string(chars.ToArray()); 
    } 

static string FormatPhoneNumber(string phoneNumber) { 

    if (String.IsNullOrEmpty(phoneNumber)) 
     return phoneNumber; 

    Regex phoneParser = null; 
    string format  = ""; 

    switch(phoneNumber.Length) { 

     case 5 : 
     phoneParser = new Regex(@"(\d{3})(\d{2})"); 
     format  = "$1 $2"; 
     break; 

     case 6 : 
     phoneParser = new Regex(@"(\d{2})(\d{2})(\d{2})"); 
     format  = "$1 $2 $3"; 
     break; 

     case 7 : 
     phoneParser = new Regex(@"(\d{3})(\d{2})(\d{2})"); 
     format  = "$1 $2 $3"; 
     break; 

     case 8 : 
     phoneParser = new Regex(@"(\d{4})(\d{2})(\d{2})"); 
     format  = "$1 $2 $3"; 
     break; 

     case 9 : 
     phoneParser = new Regex(@"(\d{4})(\d{3})(\d{2})(\d{2})"); 
     format  = "$1 $2 $3 $4"; 
     break; 

     case 10 : 
     phoneParser = new Regex(@"(\d{3})(\d{3})(\d{2})(\d{2})"); 
     format  = "($1) $2 $3 $4"; 
     break; 

     case 11 : 
     phoneParser = new Regex(@"(\d{4})(\d{3})(\d{2})(\d{2})"); 
     format  = "($1) $2 $3 $4"; 
     break; 

     default: 
     return phoneNumber; 

    }//switch 

    return phoneParser.Replace(phoneNumber, format); 

}//FormatPhoneNumber