0

電話番号フィールド用の .NET WinForms テキスト ボックスがあります。自由形式のテキストを許可した後、ユーザーがテキストボックスを離れた後、テキストを「読みやすい」電話番号としてフォーマットしたいと思います。(連絡先を作成/編集するとき、Outlook には電話フィールド用のこの機能があります)

  • 1234567 は 123-4567 になります
  • 1234567890 は (123) 456-7890 になります
  • (123)456.7890 は (123) 456-7890 になります
  • 123.4567x123 は 123-4567 x123 になります
4

7 に答える 7

2

かなり単純なアプローチは、正規表現を使用することです。受け入れている電話番号の種類に応じて、数字 (米国のみの場合、合計で 7 または 10 になる可能性があることがわかっています。先頭に「1」が付く可能性があります) と潜在的な区切り文字を検索する正規表現を作成できます。それらの間 (ピリオド、ダッシュ、括弧、スペースなど)。

正規表現に対して照合を実行したら、ロジックを記述して、実際に取得したものを判断し、そこからフォーマットする必要があります。

編集:非常に基本的な例を追加したかっただけです(これは、上に投稿したすべての例で機能するわけではありません)。正規表現の書き方によっては、数値以外の文字を削除するという Geoff の提案が少し役立つかもしれません。

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);
   }
}
于 2008-10-09T20:00:35.640 に答える
1

最も簡単な方法は、最初に文字列から数値以外の文字を取り除き、数字だけにしてから、この質問で述べたようにフォーマットすることだと思います

于 2008-10-09T20:03:46.477 に答える
1

拡張子を切り取ってから、数字以外の文字を残りから取り除きます。フォーマットしてから、拡張子を再度追加します。

Start: 123.4567x123
Lop: 123.4567
Strip: 1234567
Format: 123-4567
Add: 123-4567 x123
于 2008-10-10T05:04:18.460 に答える
1

数字以外の文字を取り除いてからフォーマットすることを考えましたが、拡張子の場合(123.4567x123)ではうまく機能しないと思います

于 2008-10-09T21:51:53.730 に答える
0

これは私にとってはうまくいきます。タイトなループでこれを行っている場合は、パフォーマンスをチェックする価値があります...

public static string FormatPhoneNumber(string phone)
{
    phone = Regex.Replace(phone, @"[^\d]", "");
    if (phone.Length == 10)
        return Regex.Replace(phone,
                             "(?<ac>\\d{3})(?<pref>\\d{3})(?<num>\\d{4})",
                             "(${ac}) ${pref}-${num}");
    else if ((phone.Length < 16) && (phone.Length > 10))
        return Regex.Replace(phone,
                             "(?<ac>\\d{3})(?<pref>\\d{3})(?<num>\\d{4})(?<ext>\\d{1,5})", 
                             "(${ac}) ${pref}-${num} x${ext}");
    else
        return string.Empty;

}

于 2009-07-13T02:02:01.313 に答える
0

I don't know of any way other than doing it yourself by possibly making some masks and checking which one it matches and doing each mask on a case by case basis. Don't think it'd be too hard, just time consuming.

于 2008-10-09T19:55:55.120 に答える
0

My guess is that you could accomplish this with a conditional statement to look at the input and then parse it into a specific format. But I'm guessing there is going to be a good amount of logic to investigate the input and format the output.

于 2008-10-09T19:55:58.783 に答える