从字符串中删除格式:“(123)456-7890”=> “1234567890”?

时间:2010-08-20 16:37:29

标签: c# .net

输入电话号码时我有一个字符串 - 有一个掩码所以它总是看起来像“(123)456-7890” - 我想在将格式保存到数据库之前取出格式。

我该怎么做?

14 个答案:

答案 0 :(得分:77)

使用linq的一种可能性是:

string justDigits = new string(s.Where(c => char.IsDigit(c)).ToArray());

通过craigmoliver添加更清洁/更短的版本

string justDigits = new string(s.Where(char.IsDigit).ToArray())

答案 1 :(得分:35)

您可以使用正则表达式删除所有非数字字符:

string phoneNumber = "(123) 456-7890";
phoneNumber = Regex.Replace(phoneNumber, @"[^\d]", "");

然后继续 - 根据您的要求 - 您可以将数字存储为字符串或整数。要将数字转换为整数类型,您将拥有以下选项:

// throws if phoneNumber is null or cannot be parsed
long number = Int64.Parse(phoneNumber, NumberStyles.Integer, CultureInfo.InvariantCulture);

// same as Int64.Parse, but returns 0 if phoneNumber is null
number = Convert.ToInt64(phoneNumber);

// does not throw, but returns true on success
if (Int64.TryParse(phoneNumber, NumberStyles.Integer, 
       CultureInfo.InvariantCulture, out number))
{
    // parse was successful
}

答案 2 :(得分:12)

因为没有人做过for循环。

long GetPhoneNumber(string PhoneNumberText)
{
    // Returns 0 on error

    StringBuilder TempPhoneNumber = new StringBuilder(PhoneNumberText.Length);
    for (int i=0;i<PhoneNumberText.Length;i++)
    {
        if (!char.IsDigit(PhoneNumberText[i]))
            continue;

        TempPhoneNumber.Append(PhoneNumberText[i]);
    }

    PhoneNumberText = TempPhoneNumber.ToString();
    if (PhoneNumberText.Length == 0)
        return 0;// No point trying to parse nothing

    long PhoneNumber = 0;
    if(!long.TryParse(PhoneNumberText,out PhoneNumber))
        return 0; // Failed to parse string

    return PhoneNumber;
}

像这样使用:

long phoneNumber = GetPhoneNumber("(123) 456-7890"); 


更新
正如pr所评论的那样,许多国家在数字的开头确实有零,如果你需要支持,那么你必须返回一个不长的字符串。要更改我的代码,请执行以下操作:

1)将函数返回类型从long更改为string 2)使函数在出错时返回null而不是0 3)在成功解析后,返回 PhoneNumberText

答案 3 :(得分:4)

您可以通过添加简单的正则表达式替换来使其适用于该数字,但我会注意更高的初始数字。例如,(876) 543-2019将溢出整数变量。

答案 4 :(得分:4)

string digits = Regex.Replace(formatted, @"\D", String.Empty, RegexOptions.Compiled);

答案 5 :(得分:3)

除了所有其他正确答案之外,将电话号码存储为整数或以其他方式删除格式可能是一个坏主意。

以下是一些注意事项:

  • 用户可能会提供不符合您预期的国际电话号码。 See these examples因此,标准美国号码的常规分组不合适。
  • 用户可能需要提供分机,例如(555) 555-5555 ext#343 #密钥实际上在拨号器/电话上,但不能以整数编码。用户可能还需要提供*密钥。
  • 某些设备允许您插入暂停(通常带有字符P),这可能是扩展程序或菜单系统所必需的,或拨入某些电话系统(例如,海外)。这些也不能编码为整数。

<强> [编辑]

在数据库中存储整数版本和字符串版本可能是个好主意。此外,在存储字符串时,您可以使用上述方法之一将所有标点符号缩减为空格。对此的正则表达式可能是:

// (222) 222-2222 ext# 333   ->   222 222 2222 # 333
phoneString = Regex.Replace(phoneString, @"[^\d#*P]", " ");

// (222) 222-2222 ext# 333   ->   2222222222333 (information lost)
phoneNumber = Regex.Replace(phoneString, @"[^\d]", "");

// you could try to avoid losing "ext" strings as in (222) 222-2222 ext.333 thus:
phoneString = Regex.Replace(phoneString, @"ex\w+", "#");
phoneString = Regex.Replace(phoneString, @"[^\d#*P]", " ");

答案 6 :(得分:2)

试试这个:

string s = "(123) 456-7890";
UInt64 i = UInt64.Parse(
    s.Replace("(","")
     .Replace(")","")
     .Replace(" ","")
     .Replace("-",""));

由于输入被屏蔽,你应该对此安全。

答案 7 :(得分:1)

您可以使用正则表达式,也可以遍历每个字符并使用char.IsNumber函数。

答案 8 :(得分:1)

最好使用regular expressions。根据定义,int只是一个数字,但您希望格式化字符使其成为电话号码,这是一个字符串。

有很多关于电话号码验证的帖子,有关初学者的信息,请参阅A comprehensive regex for phone number validation

答案 9 :(得分:1)

正如许多答案已经提到的那样,在尝试解析数字之前,您需要先删除非数字字符。您可以使用正则表达式执行此操作。

Regex.Replace("(123) 456-7890", @"\D", String.Empty) // "1234567890"

但是,请注意,int可以容纳的最大正值是2,147,483,647,因此任何区号大于214的数字都会导致溢出。在这种情况下你最好长时间使用。

对于北美数字,前导零将不会成为问题,因为区号不能以零或一个开头。

答案 10 :(得分:1)

替代使用Linq:

string phoneNumber = "(403) 259-7898";
var phoneStr = new string(phoneNumber.Where(i=> i >= 48 && i <= 57).ToArray());

答案 11 :(得分:1)

这基本上是C#: Removing common invalid characters from a string: improve this algorithm的一个特例。你的格式包含的地方。白色空间被视为“坏人物”

答案 12 :(得分:0)

public static string DigitsOnly(this string phoneNumber)
{
    return new string(
        new[]
            {
             // phoneNumber[0],     (
                phoneNumber[1],  // 6
                phoneNumber[2],  // 1
                phoneNumber[3],  // 7
             // phoneNumber[4],     )
             // phoneNumber[5],   
                phoneNumber[6],  // 8
                phoneNumber[7],  // 6
                phoneNumber[8],  // 7
             // phoneNumber[9],     -
                phoneNumber[10], // 5
                phoneNumber[11], // 3
                phoneNumber[12], // 0
                phoneNumber[13]  // 9
            });
}

答案 13 :(得分:0)

'you can use module / inside sub main form VB.net
Public Function ClearFormat(ByVal Strinput As String) As String
    Dim hasil As String
    Dim Hrf As Char
    For i = 0 To Strinput.Length - 1
        Hrf = Strinput.Substring(i, 1)
        If IsNumeric(Hrf) Then
            hasil &= Hrf
        End If
    Next
    Return Strinput
End Function
'you can call this function like this
' Phone= ClearFormat(Phone)