ann*_*lie 7 c# asp.net validation parsing
我想知道在发送文本之前解析和验证手机号码的最佳做法是什么.我已经有了可行的代码,但我想找到更好的方法(我的最后一个问题,这是我早期新年决议中编写质量更好的代码的一部分!).
当用户输入表格上的号码时,我们非常宽容,他们可以输入"+44 123 4567890","00441234567890","0123456789","+ 44(0)123456789","012-345"等内容. -6789"甚至"没有电话".
但是,要发送文本格式必须是44xxxxxxxxxx(这仅适用于英国手机),因此我们需要解析并验证它才能发送.下面是我现在的代码(C#,asp.net),如果有人对如何改进它有任何想法会很棒.
谢谢,
Annelie
private bool IsMobileNumberValid(string mobileNumber)
{
// parse the number
_mobileNumber = ParsedMobileNumber(mobileNumber);
// check if it's the right length
if (_mobileNumber.Length != 12)
{
return false;
}
// check if it contains non-numeric characters
if(!Regex.IsMatch(_mobileNumber, @"^[-+]?[0-9]*\.?[0-9]+$"))
{
return false;
}
return true;
}
private string ParsedMobileNumber(string number)
{
number = number.Replace("+", "");
number = number.Replace(".", "");
number = number.Replace(" ", "");
number = number.Replace("-", "");
number = number.Replace("/", "");
number = number.Replace("(", "");
number = number.Replace(")", "");
number = number.Trim(new char[] { '0' });
if (!number.StartsWith("44"))
{
number = "44" + number;
}
return number;
}
Run Code Online (Sandbox Code Playgroud)
编辑
这是我最终得到的:
private bool IsMobileNumberValid(string mobileNumber)
{
// remove all non-numeric characters
_mobileNumber = CleanNumber(mobileNumber);
// trim any leading zeros
_mobileNumber = _mobileNumber.TrimStart(new char[] { '0' });
// check for this in case they've entered 44 (0)xxxxxxxxx or similar
if (_mobileNumber.StartsWith("440"))
{
_mobileNumber = _mobileNumber.Remove(2, 1);
}
// add country code if they haven't entered it
if (!_mobileNumber.StartsWith("44"))
{
_mobileNumber = "44" + _mobileNumber;
}
// check if it's the right length
if (_mobileNumber.Length != 12)
{
return false;
}
return true;
}
private string CleanNumber(string phone)
{
Regex digitsOnly = new Regex(@"[^\d]");
return digitsOnly.Replace(phone, "");
}
Run Code Online (Sandbox Code Playgroud)
使用正则表达式删除任何非数字字符,而不是尝试猜测人们将如何输入数字 - 这将删除所有 Replace() 和 Trim() 方法,除非您确实需要修剪前导零。
string CleanPhone(string phone)
{
Regex digitsOnly = new Regex(@"[^\d]");
return digitsOnly.Replace(phone, "");
}
Run Code Online (Sandbox Code Playgroud)
或者,我建议您使用屏蔽文本框来收集 # (有许多可用选项)以仅允许数字输入,并以您想要的任何格式显示输入。这样您就可以保证收到的值都是数字字符。