[C#] ハイフンなしの電話番号からハイフン付き電話番号を復元する

# はじめに

*こんにちは、のんびりエンジニアのたっつーです。*
*[ブログ](https://www.fast-system.jp/)を運営しているのでよろしければ見てください。*

[[PHP] ハイフンなしの電話番号からハイフン付き電話番号を復元する](http://qiita.com/mpyw/items/431c0c8cb70084a74be5)

上記のPHP実装をC#用に書き換えました。

# ソースコード

```csharp:Program.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

namespace FormatPhoneNumber
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Console.Out.WriteLine(FormatPhoneNumber("0311112222"));  // 03:OK
            System.Console.Out.WriteLine(FormatPhoneNumber("09011112222")); // 090:OK
            System.Console.Out.WriteLine(FormatPhoneNumber("0120111222"));  // 0120:OK
            System.Console.Out.WriteLine(FormatPhoneNumber("08001112222")); // 0800:OK
        }

        public static string FormatPhoneNumber(string input)
        {
            return FormatPhoneNumber(input, false);
        }

        public static string FormatPhoneNumber(string input, bool strict)
        {
            Dictionary<int, Dictionary<string, int>> groups = new Dictionary<int, Dictionary<string, int>>();
            {
                Dictionary<string, int> group5 = new Dictionary<string, int>();
                group5.Add("01564", 1);
                group5.Add("01558", 1);
                group5.Add("01586", 1);
                group5.Add("01587", 1);
                group5.Add("01634", 1);
                group5.Add("01632", 1);
                group5.Add("01547", 1);
                group5.Add("05769", 1);
                group5.Add("04992", 1);
                group5.Add("04994", 1);
                group5.Add("01456", 1);
                group5.Add("01457", 1);
                group5.Add("01466", 1);
                group5.Add("01635", 1);
                group5.Add("09496", 1);
                group5.Add("08477", 1);
                group5.Add("08512", 1);
                group5.Add("08396", 1);
                group5.Add("08388", 1);
                group5.Add("08387", 1);
                group5.Add("08514", 1);
                group5.Add("07468", 1);
                group5.Add("01655", 1);
                group5.Add("01648", 1);
                group5.Add("01656", 1);
                group5.Add("01658", 1);
                group5.Add("05979", 1);
                group5.Add("04996", 1);
                group5.Add("01654", 1);
                group5.Add("01372", 1);
                group5.Add("01374", 1);
                group5.Add("09969", 1);
                group5.Add("09802", 1);
                group5.Add("09912", 1);
                group5.Add("09913", 1);
                group5.Add("01398", 1);
                group5.Add("01377", 1);
                group5.Add("01267", 1);
                group5.Add("04998", 1);
                group5.Add("01397", 1);
                group5.Add("01392", 1);
                groups.Add(5, group5);
                Dictionary<string, int> group4 = new Dictionary<string, int>();
                group4.Add("0768", 2);
                group4.Add("0770", 2);
                group4.Add("0772", 2);
                group4.Add("0774", 2);
                group4.Add("0773", 2);
                group4.Add("0767", 2);
                group4.Add("0771", 2);
                group4.Add("0765", 2);
                group4.Add("0748", 2);
                group4.Add("0747", 2);
                group4.Add("0746", 2);
                group4.Add("0826", 2);
                group4.Add("0749", 2);
                group4.Add("0776", 2);
                group4.Add("0763", 2);
                group4.Add("0761", 2);
                group4.Add("0766", 2);
                group4.Add("0778", 2);
                group4.Add("0824", 2);
                group4.Add("0797", 2);
                group4.Add("0796", 2);
                group4.Add("0555", 2);
                group4.Add("0823", 2);
                group4.Add("0798", 2);
                group4.Add("0554", 2);
                group4.Add("0820", 2);
                group4.Add("0795", 2);
                group4.Add("0556", 2);
                group4.Add("0791", 2);
                group4.Add("0790", 2);
                group4.Add("0779", 2);
                group4.Add("0558", 2);
                group4.Add("0745", 2);
                group4.Add("0794", 2);
                group4.Add("0557", 2);
                group4.Add("0799", 2);
                group4.Add("0738", 2);
                group4.Add("0567", 2);
                group4.Add("0568", 2);
                group4.Add("0585", 2);
                group4.Add("0586", 2);
                group4.Add("0566", 2);
                group4.Add("0564", 2);
                group4.Add("0565", 2);
                group4.Add("0587", 2);
                group4.Add("0584", 2);
                group4.Add("0581", 2);
                group4.Add("0572", 2);
                group4.Add("0574", 2);
                group4.Add("0573", 2);
                group4.Add("0575", 2);
                group4.Add("0576", 2);
                group4.Add("0578", 2);
                group4.Add("0577", 2);
                group4.Add("0569", 2);
                group4.Add("0594", 2);
                group4.Add("0827", 2);
                group4.Add("0736", 2);
                group4.Add("0735", 2);
                group4.Add("0725", 2);
                group4.Add("0737", 2);
                group4.Add("0739", 2);
                group4.Add("0743", 2);
                group4.Add("0742", 2);
                group4.Add("0740", 2);
                group4.Add("0721", 2);
                group4.Add("0599", 2);
                group4.Add("0561", 2);
                group4.Add("0562", 2);
                group4.Add("0563", 2);
                group4.Add("0595", 2);
                group4.Add("0596", 2);
                group4.Add("0598", 2);
                group4.Add("0597", 2);
                group4.Add("0744", 2);
                group4.Add("0852", 2);
                group4.Add("0956", 2);
                group4.Add("0955", 2);
                group4.Add("0954", 2);
                group4.Add("0952", 2);
                group4.Add("0957", 2);
                group4.Add("0959", 2);
                group4.Add("0966", 2);
                group4.Add("0965", 2);
                group4.Add("0964", 2);
                group4.Add("0950", 2);
                group4.Add("0949", 2);
                group4.Add("0942", 2);
                group4.Add("0940", 2);
                group4.Add("0930", 2);
                group4.Add("0943", 2);
                group4.Add("0944", 2);
                group4.Add("0948", 2);
                group4.Add("0947", 2);
                group4.Add("0946", 2);
                group4.Add("0967", 2);
                group4.Add("0968", 2);
                group4.Add("0987", 2);
                group4.Add("0986", 2);
                group4.Add("0985", 2);
                group4.Add("0984", 2);
                group4.Add("0993", 2);
                group4.Add("0994", 2);
                group4.Add("0997", 2);
                group4.Add("0996", 2);
                group4.Add("0995", 2);
                group4.Add("0983", 2);
                group4.Add("0982", 2);
                group4.Add("0973", 2);
                group4.Add("0972", 2);
                group4.Add("0969", 2);
                group4.Add("0974", 2);
                group4.Add("0977", 2);
                group4.Add("0980", 2);
                group4.Add("0979", 2);
                group4.Add("0978", 2);
                group4.Add("0920", 2);
                group4.Add("0898", 2);
                group4.Add("0855", 2);
                group4.Add("0854", 2);
                group4.Add("0853", 2);
                group4.Add("0553", 2);
                group4.Add("0856", 2);
                group4.Add("0857", 2);
                group4.Add("0863", 2);
                group4.Add("0859", 2);
                group4.Add("0858", 2);
                group4.Add("0848", 2);
                group4.Add("0847", 2);
                group4.Add("0835", 2);
                group4.Add("0834", 2);
                group4.Add("0833", 2);
                group4.Add("0836", 2);
                group4.Add("0837", 2);
                group4.Add("0846", 2);
                group4.Add("0845", 2);
                group4.Add("0838", 2);
                group4.Add("0865", 2);
                group4.Add("0866", 2);
                group4.Add("0892", 2);
                group4.Add("0889", 2);
                group4.Add("0887", 2);
                group4.Add("0893", 2);
                group4.Add("0894", 2);
                group4.Add("0897", 2);
                group4.Add("0896", 2);
                group4.Add("0895", 2);
                group4.Add("0885", 2);
                group4.Add("0884", 2);
                group4.Add("0869", 2);
                group4.Add("0868", 2);
                group4.Add("0867", 2);
                group4.Add("0875", 2);
                group4.Add("0877", 2);
                group4.Add("0883", 2);
                group4.Add("0880", 2);
                group4.Add("0879", 2);
                group4.Add("0829", 2);
                group4.Add("0550", 2);
                group4.Add("0228", 2);
                group4.Add("0226", 2);
                group4.Add("0225", 2);
                group4.Add("0224", 2);
                group4.Add("0229", 2);
                group4.Add("0233", 2);
                group4.Add("0237", 2);
                group4.Add("0235", 2);
                group4.Add("0234", 2);
                group4.Add("0223", 2);
                group4.Add("0220", 2);
                group4.Add("0192", 2);
                group4.Add("0191", 2);
                group4.Add("0187", 2);
                group4.Add("0193", 2);
                group4.Add("0194", 2);
                group4.Add("0198", 2);
                group4.Add("0197", 2);
                group4.Add("0195", 2);
                group4.Add("0238", 2);
                group4.Add("0240", 2);
                group4.Add("0260", 2);
                group4.Add("0259", 2);
                group4.Add("0258", 2);
                group4.Add("0257", 2);
                group4.Add("0261", 2);
                group4.Add("0263", 2);
                group4.Add("0266", 2);
                group4.Add("0265", 2);
                group4.Add("0264", 2);
                group4.Add("0256", 2);
                group4.Add("0255", 2);
                group4.Add("0243", 2);
                group4.Add("0242", 2);
                group4.Add("0241", 2);
                group4.Add("0244", 2);
                group4.Add("0246", 2);
                group4.Add("0254", 2);
                group4.Add("0248", 2);
                group4.Add("0247", 2);
                group4.Add("0186", 2);
                group4.Add("0185", 2);
                group4.Add("0144", 2);
                group4.Add("0143", 2);
                group4.Add("0142", 2);
                group4.Add("0139", 2);
                group4.Add("0145", 2);
                group4.Add("0146", 2);
                group4.Add("0154", 2);
                group4.Add("0153", 2);
                group4.Add("0152", 2);
                group4.Add("0138", 2);
                group4.Add("0137", 2);
                group4.Add("0125", 2);
                group4.Add("0124", 2);
                group4.Add("0123", 2);
                group4.Add("0126", 2);
                group4.Add("0133", 2);
                group4.Add("0136", 2);
                group4.Add("0135", 2);
                group4.Add("0134", 2);
                group4.Add("0155", 2);
                group4.Add("0156", 2);
                group4.Add("0176", 2);
                group4.Add("0175", 2);
                group4.Add("0174", 2);
                group4.Add("0178", 2);
                group4.Add("0179", 2);
                group4.Add("0184", 2);
                group4.Add("0183", 2);
                group4.Add("0182", 2);
                group4.Add("0173", 2);
                group4.Add("0172", 2);
                group4.Add("0162", 2);
                group4.Add("0158", 2);
                group4.Add("0157", 2);
                group4.Add("0163", 2);
                group4.Add("0164", 2);
                group4.Add("0167", 2);
                group4.Add("0166", 2);
                group4.Add("0165", 2);
                group4.Add("0267", 2);
                group4.Add("0250", 2);
                group4.Add("0533", 2);
                group4.Add("0422", 2);
                group4.Add("0532", 2);
                group4.Add("0531", 2);
                group4.Add("0436", 2);
                group4.Add("0428", 2);
                group4.Add("0536", 2);
                group4.Add("0299", 2);
                group4.Add("0294", 2);
                group4.Add("0293", 2);
                group4.Add("0475", 2);
                group4.Add("0295", 2);
                group4.Add("0297", 2);
                group4.Add("0296", 2);
                group4.Add("0495", 2);
                group4.Add("0438", 2);
                group4.Add("0466", 2);
                group4.Add("0465", 2);
                group4.Add("0467", 2);
                group4.Add("0478", 2);
                group4.Add("0476", 2);
                group4.Add("0470", 2);
                group4.Add("0463", 2);
                group4.Add("0479", 2);
                group4.Add("0493", 2);
                group4.Add("0494", 2);
                group4.Add("0439", 2);
                group4.Add("0268", 2);
                group4.Add("0480", 2);
                group4.Add("0460", 2);
                group4.Add("0538", 2);
                group4.Add("0537", 2);
                group4.Add("0539", 2);
                group4.Add("0279", 2);
                group4.Add("0548", 2);
                group4.Add("0280", 2);
                group4.Add("0282", 2);
                group4.Add("0278", 2);
                group4.Add("0277", 2);
                group4.Add("0269", 2);
                group4.Add("0270", 2);
                group4.Add("0274", 2);
                group4.Add("0276", 2);
                group4.Add("0283", 2);
                group4.Add("0551", 2);
                group4.Add("0289", 2);
                group4.Add("0287", 2);
                group4.Add("0547", 2);
                group4.Add("0288", 2);
                group4.Add("0544", 2);
                group4.Add("0545", 2);
                group4.Add("0284", 2);
                group4.Add("0291", 2);
                group4.Add("0285", 2);
                group4.Add("0120", 3);
                group4.Add("0570", 3);
                group4.Add("0800", 3);
                group4.Add("0990", 3);
                groups.Add(4, group4);
                Dictionary<string, int> group3 = new Dictionary<string, int>();
                group3.Add("099", 3);
                group3.Add("054", 3);
                group3.Add("058", 3);
                group3.Add("098", 3);
                group3.Add("095", 3);
                group3.Add("097", 3);
                group3.Add("052", 3);
                group3.Add("053", 3);
                group3.Add("011", 3);
                group3.Add("096", 3);
                group3.Add("049", 3);
                group3.Add("015", 3);
                group3.Add("048", 3);
                group3.Add("072", 3);
                group3.Add("084", 3);
                group3.Add("028", 3);
                group3.Add("024", 3);
                group3.Add("076", 3);
                group3.Add("023", 3);
                group3.Add("047", 3);
                group3.Add("029", 3);
                group3.Add("075", 3);
                group3.Add("025", 3);
                group3.Add("055", 3);
                group3.Add("026", 3);
                group3.Add("079", 3);
                group3.Add("082", 3);
                group3.Add("027", 3);
                group3.Add("078", 3);
                group3.Add("077", 3);
                group3.Add("083", 3);
                group3.Add("022", 3);
                group3.Add("086", 3);
                group3.Add("089", 3);
                group3.Add("045", 3);
                group3.Add("044", 3);
                group3.Add("092", 3);
                group3.Add("046", 3);
                group3.Add("017", 3);
                group3.Add("093", 3);
                group3.Add("059", 3);
                group3.Add("073", 3);
                group3.Add("019", 3);
                group3.Add("087", 3);
                group3.Add("042", 3);
                group3.Add("018", 3);
                group3.Add("043", 3);
                group3.Add("088", 3);
                group3.Add("050", 4);
                groups.Add(3, group3);
                Dictionary<string, int> group2 = new Dictionary<string, int>();
                group2.Add("04", 4);
                group2.Add("03", 4);
                group2.Add("06", 4);
                groups.Add(2, group2);
                if (strict)
                {
                    group3.Add("020", 3);
                    group3.Add("070", 3);
                    group3.Add("080", 3);
                    group3.Add("090", 3);
                }
                else
                {
                    group3.Add("020", 4);
                    group3.Add("070", 4);
                    group3.Add("080", 4);
                    group3.Add("090", 4);
                }
            }

            string number = Regex.Replace(input, @"[^\d]+", "");

            foreach (int _ in groups.Keys)
            {
                Dictionary<string, int> group = groups[_];
                int len = _;
                string area = number.Substring(0, len);
                if (group.ContainsKey(area))
                {
                    string formatted1 = number.Substring(len, group[area]);
                    string formatted2 = number.Substring(len + group[area]);
                    string formatted = area + "-" + formatted1 + "-" + formatted2;
                    if (formatted[formatted.Length - 1] != '-')
                        return formatted;
                    else
                        return input;
                }
            }

            string pattern = @"\A(00(?:[013-8]|2\d|91[02-9])\d)(\d+)\z";
            Match matches = Regex.Match(number, pattern);
            if (matches.Success)
            {
                return matches.Groups[1] + "-" + matches.Groups[2];
            }

            return input;
        }
    }
}
```

# 終わりに

*よければ ブログ「[初心者向けUnity情報サイト](https://www.fast-system.jp/)」の方にも色々記載しているのでぜひご参照いただければと思います。*