Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从字符串中删除格式:“删除”;(123)456-7890“=&燃气轮机&引用;1234567890";?_C#_.net - Fatal编程技术网

C# 从字符串中删除格式:“删除”;(123)456-7890“=&燃气轮机&引用;1234567890";?

C# 从字符串中删除格式:“删除”;(123)456-7890“=&燃气轮机&引用;1234567890";?,c#,.net,C#,.net,当输入电话号码时,我有一个字符串-有一个掩码,所以它看起来总是像“(123)456-7890”-我想在将其保存到DB之前去掉格式 我如何才能做到这一点?使用linq的一种可能性是: string justDigits = new string(s.Where(c => char.IsDigit(c)).ToArray()); 由于craigmoliver,添加了更干净/更短的版本 string justDigits = new string(s.Where(char.IsDigit).T

当输入电话号码时,我有一个字符串-有一个掩码,所以它看起来总是像“(123)456-7890”-我想在将其保存到DB之前去掉格式


我如何才能做到这一点?

使用linq的一种可能性是:

string justDigits = new string(s.Where(c => char.IsDigit(c)).ToArray());
由于craigmoliver,添加了更干净/更短的版本

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

您可以使用正则表达式,也可以在每个字符上循环并使用函数。

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

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


有很多关于电话号码验证的帖子,请参阅以获取入门资料。

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

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
}
试试这个:

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

由于输入是屏蔽的,您应该可以放心地使用它。

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

string digits = Regex.Replace(formatted, @"\D", String.Empty, RegexOptions.Compiled);
Regex.Replace("(123) 456-7890", @"\D", String.Empty) // "1234567890"
但是,请注意int可以容纳的最大正值是2147483647,因此任何区号大于214的数字都会导致溢出。在这种情况下,你最好使用long


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

使用Linq的替代方案:

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

var phoneStr=新字符串(phoneNumber.Where(i=>i>=48&&i),因为没有人执行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;
}

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

1) 将函数返回类型从long更改为string。
2) 在出现错误时,使函数返回null而不是0

3) 成功解析后,将其返回PhoneNumberText

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

以下是一些注意事项:

  • 用户可能会提供不符合您期望的国际电话号码。因此,通常的美国标准数字分组不合适
  • 用户可能需要提供分机,例如
    (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]", " ");

这基本上是一种特殊情况。如果您的格式化(包括空格)被视为“坏字符”

如果数字是
“(543)231-2322”
,您将溢出
int32
。您知道他实际上并不想要数字,对吗?
int.TryParse
只是他最初的猜测——这是一个骗局。@Gabe:我知道,这没有道理。尤其是因为输入在UI中被屏蔽和验证。这是一个愚蠢的问题,大部分答案都是愚蠢的。我想人们只是玩得很开心。例如,For-loop解决方案获得了六票。。。为什么?极客回归投票?娱乐。今天是星期五。这根本不是一个愚蠢的问题。他有一个带有格式的输入字符串,他想知道如何删除该格式。唯一愚蠢的是,每个人都认为他想要一个整数,因为他认为int.TryParse可能会以某种方式解决他的问题。你将不断地改变这个。当输入为“543.231.2322”时会发生什么?我见过句号,斜杠,各种非数字字符。事实上,我有过类似“三楼”这样的电话号码。用户。这个回答很糟糕。这只会删除第一个
,在OP的示例中。stackoverflow上的结对编程:)@Toby:Linq解决方案在我的基准测试中似乎快了四倍,但for循环比EKS的答案快得多(比Linq快五倍)。+1:清晰而优雅。它甚至比正则表达式答案(IMO)更清楚,因为它说明的是IsDigit而不是简练的\d。(啊,林克。你可以从我的答案中的片段猜到,我仍然在努力学习.NET2.0。)它可以重写为:新字符串(s.Where(char.IsDigit).ToArray())
[^\d]
应该和
\d
一样?是的,它是一样的。这没有什么区别,只是
[^\d]
更明确,需要的学习更少。您必须了解
[^]
。我认为
\d
需要较少的学习。嗯。。。我真的有点想拨那个号码,看看它是不是真的。我不知道如果有人回答我会说什么。@viraptor-不知何故,我想他只会看到我们的号码。我误读了这个问题,但同样的信息也适用。如果接收到额外的字符,可以使用正则表达式将其删除。我仍然将电话号码存储为字符串,因为前导零可能是电话号码的有效部分,否则将作为int.John删除
// (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]", " ");
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
            });
}
'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)