C# 从字符串中删除格式:“删除”;(123)456-7890“=&燃气轮机&引用;1234567890";?
当输入电话号码时,我有一个字符串-有一个掩码,所以它看起来总是像“(123)456-7890”-我想在将其保存到DB之前去掉格式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
我如何才能做到这一点?使用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)