输入电话号码时我有一个字符串 - 有一个掩码所以它总是看起来像“(123)456-7890” - 我想在将格式保存到数据库之前取出格式。
我该怎么做?
答案 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)
除了所有其他正确答案之外,将电话号码存储为整数或以其他方式删除格式可能是一个坏主意。
以下是一些注意事项:
(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)