Проблема заключается в вашем else if
состоянии, когда у вас есть установленное количество #
заполнителей для обработки добавочного номера телефона. Вместо этого мы можем определить формат динамически для учета различной длины.
Почему вы проходите в object
? Вы используете ToString()
повсюду. Почему бы не передать string
с самого начала? Если передаваемый элемент не является строкой, то перед передачей вызовите ToString
или сохраните результат ToString()
в переменной в методе, как показано ниже.
Вот обновленная версия вашего метода:
public static string _FormatPhone(object phonevalue)
{
string returnPhone = "Format Err#";
Int64 phoneDigits;
string phoneNumber = phonevalue.ToString();
if (Int64.TryParse(phoneNumber, out phoneDigits))
{
if (phoneNumber.Length == 10)
{
return phoneDigits.ToString("(###) ###-####");
}
else if (phoneNumber.Length > 10)
{
// determine the length of placeholders needed for the format
string format = "(###) ###-#### x"
+ new string('#', phoneNumber.Length - 10);
return phoneDigits.ToString(format);
}
else
{
return phoneNumber;
}
}
return returnPhone;
}
Чтобы проверить это:
string[] inputs = { "456", "4445552222", "444555222288", "44455522226789" };
foreach (string input in inputs)
{
Console.WriteLine("Format Result: " + _FormatPhone(input));
}
В этом случае нет необходимости в регулярном выражении. Если вы действительно хотите использовать один из них, ваш метод замены должен определить длину, чтобы добавить расширение при необходимости, как показано ниже:
string[] inputs = { "456", "4445552222", "444555222288", "44455522226789" };
string pattern = @"(\d{3})(\d{3})(\d{4})(\d*)";
foreach (string input in inputs)
{
string result = Regex.Replace(input, pattern, m =>
{
if (m.Value.Length >= 10)
{
return String.Format("({0}) {1}-{2}",
m.Groups[1].Value, m.Groups[2].Value, m.Groups[3].Value)
+ (m.Value.Length > 10 ? " x" + m.Groups[4].Value : "");
}
return m.Value;
});
Console.WriteLine("Regex result: " + result);
}