Довольно простой подход заключается в использовании регулярного выражения. В зависимости от того, какой тип телефонных номеров вы принимаете, вы можете написать регулярное выражение, которое ищет цифры (только для США, вы знаете, что может быть всего 7 или 10, возможно, с начальным '1') и потенциальными разделителями. между ними (точка, тире, парены, пробелы и т. д.).
Как только вы запустите сравнение с регулярным выражением, вам нужно написать логику, чтобы определить, что вы на самом деле получили, и отформатировать ее оттуда.
РЕДАКТИРОВАТЬ: Просто хотел добавить очень простой пример (ни в коем случае это не будет работать для всех примеров, которые вы опубликовали выше). Предложение Джеффа об удалении нечисловых символов может немного помочь в зависимости от того, как вы пишете свое регулярное выражение.
Regex regex = new Regex(@"(?<areaCode>([\d]{3}))?[\s.-]?(?<leadingThree>([\d]{3}))[\s.-]?(?<lastFour>([\d]{4}))[x]?(?<extension>[\d]{1,})?");
string phoneNumber = "701 123-4567x324";
Match phoneNumberMatch = regex.Match(phoneNumber);
if(phoneNumberMatch.Success)
{
if (phoneNumberMatch.Groups["areaCode"].Success)
{
Console.WriteLine(phoneNumberMatch.Groups["areaCode"].Value);
}
if (phoneNumberMatch.Groups["leadingThree"].Success)
{
Console.WriteLine(phoneNumberMatch.Groups["leadingThree"].Value);
}
if (phoneNumberMatch.Groups["lastFour"].Success)
{
Console.WriteLine(phoneNumberMatch.Groups["lastFour"].Value);
}
if (phoneNumberMatch.Groups["extension"].Success)
{
Console.WriteLine(phoneNumberMatch.Groups["extension"].Value);
}
}