using System.Collections.Generic;
using System.Threading.Tasks;
using System.Text.RegularExpressions;
public static void Main(){
var phone = new PhoneNumber("47128696097");
Console.WriteLine(phone.Number);
Console.WriteLine(IsValidPhoneNumber(phone.Number));
Console.WriteLine(GetFormattedPhoneNumber(phone.Number));
private static bool IsValidPhoneNumber(string phoneNumber)
var minimumPhoneLength = 5;
var regexCharsToStrip = new Regex("(?:[^0-9]|(?<=['\"])s)", RegexOptions.CultureInvariant | RegexOptions.Compiled);
var rawNumber = regexCharsToStrip.Replace(phoneNumber, string.Empty);
return !string.IsNullOrWhiteSpace(phoneNumber)
&& !string.IsNullOrEmpty(rawNumber)
&& rawNumber.Length >= minimumPhoneLength;
private static string GetFormattedPhoneNumber(string phoneNumber)
phoneNumber = phoneNumber.Trim();
var phoneInfo = new PhoneNumber(phoneNumber);
if (string.IsNullOrWhiteSpace(phoneInfo.Number))
var stringBuilder = new StringBuilder();
if (phoneInfo.HasExtension)
stringBuilder.Append(phoneInfo.Extension + " ");
if (phoneInfo.HasAreaCode)
stringBuilder.Append(phoneInfo.AreaCode + " ");
var number = phoneInfo.Number.Replace(" ", string.Empty);
if (phoneInfo.HasExtension && number.Length == 9)
stringBuilder.Append($"{number.Substring(0, 3)} " +
$"{number.Substring(3, 3)} {phoneNumber.Substring(6, 3)}");
else if (phoneInfo.HasAreaCode && number.Length == 8)
stringBuilder.Append($"{number.Substring(0, 4)} {number.Substring(4, 4)}");
else if (number[0] == '0' && number.Length == 10)
stringBuilder.Append($"{number.Substring(0, 2)} " +
$"{phoneNumber.Substring(2, 3)} " +
$"{phoneNumber.Substring(5, 3)} " +
$"{phoneNumber.Substring(8, 3)}");
stringBuilder.Append(phoneInfo.Number);
return stringBuilder.ToString();
internal class PhoneNumber
public PhoneNumber(string phoneNumber)
Extension = ExtractPhoneExtension(phoneNumber);
AreaCode = ExtractPhoneAreaCode(phoneNumber);
Number = Number.Replace(Extension, string.Empty).Trim();
Number = Number.Replace(AreaCode, string.Empty).Trim();
public string Extension { get; }
public bool HasExtension => !string.IsNullOrEmpty(Extension);
public string AreaCode { get; }
public bool HasAreaCode => !string.IsNullOrEmpty(AreaCode);
public string Number { get; }
private static string ExtractPhoneExtension(string phoneNumber)
if (phoneNumber[0] == '+' && phoneNumber.Length > 3)
return phoneNumber.Substring(0, 3);
private static string ExtractPhoneAreaCode(string phoneNumber)
var regex = new Regex(@"^(\(\d.\))", RegexOptions.CultureInvariant | RegexOptions.Compiled);
var matches = regex.Match(phoneNumber);
if (matches.Success && matches.Groups.Count >= 1)
return matches.Groups[0].Value;