2

テキストボックスをクラスのメンバーにバインドしています。電話番号の外観を微調整して読みやすくする必要があります (ユーザーは "1234567890" や "+01234567890" などの値を見たくありません)。 )。だから、私はこのコードを持っています:

var bindingPhone = new Binding("Text", platypusInfo, "Phone1", true);
bindingPhone.Format += phoneBinding_Format;
textBoxPhoneNum1.DataBindings.Add(bindingPhone);

...

private void phoneBinding_Format(object sender, ConvertEventArgs e) {
    e.Value = ??How can I deal with this??
}

ただし、通常は "NNNNNNNNNN" ("1234567890" など) または "+NNNNNNNNNNN" ("+01234567890" など) のいずれかですが、電話番号の値は、次のような他の多くの順列にも表示されます。

 (NN) NNNN NNNN
++NNNNNNNNNNNNN
+NNNNNNNNNNNNN
+NN NNNNNNNNNNN
NNNNNNNNNNNN

これらの電話番号を「434-859-4365」ではなく「43-4859-4365」などの無意味な部分に分割せずに読みやすくする phoneBinding_Format() でできることはありますか?

アップデート

これらの要因により:

1) 同時にいくつかのプロジェクトに取り組んでおり、別のプロジェクトに戻る必要がある 2) 最も一般的な 2 つの形式は、電話番号の大部分を占めている 3) これは単なる「便利な機能」であり、「なくてはならない」機能ではない特徴

...Jon Skeet の回答に基づいて、今のところ次のように決めました。

private void phoneBinding_Format(object sender, ConvertEventArgs e)
{
    const int UK_PHONE_LEN = 9;                     // +NNNNNNNN 
     const int US_PHONE_FORMAT_LEN = 10;             // NNNNNNNNNN
    const int COMMON_INTERNATIONAL_FORMAT_LEN = 12; //+NNNNNNNNNNN 

    string phone;
    string area;
    string major;
    string minor;
    string intl_firstsegment;
    string intl_secondsegment;
    string intl_thirdsegment;
    string intl_fourthsegment;
    string intl_fifthsegment;

    if (e.Value.ToString().Length == US_PHONE_FORMAT_LEN)
    {
        phone = e.Value.ToString();
        area = phone.Substring(0, 3);
        major = phone.Substring(3, 3);
        minor = phone.Substring(6);
        e.Value = string.Format("{0}-{1}-{2}", area, major, minor); 
    } 
else if ((e.Value.ToString().Length == UK_PHONE_LEN) && (e.Value.ToString()[0] == '+')) {
    phone = e.Value.ToString();
    intl_firstsegment = phone.Substring(0, 2);
    intl_secondsegment = phone.Substring(2, 3);
    intl_thirdsegment = phone.Substring(5);
    e.Value = string.Format("+{0}-{1}-{2}", intl_firstsegment, intl_secondsegment, intl_thirdsegment);
} 
else if ((e.Value.ToString().Length == COMMON_INTERNATIONAL_PHONE_LEN) && (e.Value.ToString()[0] == '+')) 
    {
        phone = e.Value.ToString();
        intl_firstsegment = phone.Substring(0, 2);
        intl_secondsegment = phone.Substring(2, 2);
        intl_thirdsegment = phone.Substring(4, 3);
        intl_fourthsegment = phone.Substring(7, 2);
        intl_fifthsegment = phone.Substring(9);
        e.Value = string.Format("+{0}-{1}-{2}-{3}-{4}", intl_firstsegment, intl_secondsegment, intl_thirdsegment, intl_fourthsegment, intl_fifthsegment);
    }
}

ところで、ブレークポイントの涅槃への途中で興味深いことが起こりました:私はもともとこれらのテストを持っていました (最初の文字はプラス記号で、長さは予想されます)。配列の境界。

長さが最初にチェックされるように条件を逆にすると (長さが 0/文字列が空の場合は当然失敗しません)、修正されました (その後、char 0 へのアクセスは試行されないため)。

4

5 に答える 5

7

GoogleのLibPhoneNumberは、米国(および米国と100%互換性のあるカナダ)の番号に加えて国際電話番号をサポートしたい場合に必要なものです。

国際電話番号の解析、フォーマット、保存、検証のためのGoogleの一般的なJava、C ++、およびJavascriptライブラリ。Javaバージョンは、スマートフォンでの実行用に最適化されており、4.0以降のAndroidフレームワーク(Ice Cream Sandwich)で使用されています。

C#から使用する:

http://blog.thekieners.com/2011/06/06/using-googles-libphonenumber-in-microsoft-net-with-c/

C#ポート

https://bitbucket.org/pmezard/libphonenumber-csharp/wiki/Home

于 2012-07-17T17:44:40.020 に答える
2

最も簡単なアプローチは、フォーマットを適用する前に、文字列からすべての非数字と空白を取り除くことです。

http://msdn.microsoft.com/en-us/library/844skk0h.aspx

于 2012-07-17T17:38:37.437 に答える
1

私は個人的に、数字の電話番号のみが許可されることを指定し(つまり、ユーザーは1-800-FLOWERSのような電話番号を入力できない)、フォーマットする前にすべての非数字を削除します。

于 2012-07-17T17:38:15.737 に答える
1

私が得ているのは、フォーマットなしで 10 桁の文字フォーマット (「1234567890」) で格納されている数字があるということですが、数字が国にとって無意味になることなく、数字を読みやすくするためにフォーマットを追加する必要があります。国/地域によって番号のデフォルト形式が異なるため、市外局番、電話局、および加入者の (ACD) COX-SUBS の NANPA システムが常に適用されるとは限りません。

私の提案は、電話番号マスクのテーブルまたはディクショナリを維持し、MaskedTextBox を使用して、番号だけでなくマスクも連絡先オブジェクトのデータにバインドすることです。

たとえば、電話マスク ID 1 は NANPA 番号の場合があります: 「000-000-0000」。フォン マスク ID 2 は、ロンドンのメトロ番号用で、「\000 0000 0000」になります (先頭の数字は常にゼロであり、国外から電話をかける場合は省略してください)。ID 3 は、フランスの電話番号の可能性があります: "00 00 00 00 00"。実際のマスク文字列を TextBox に提供するオブジェクトに「取得専用」プロパティを指定し、ユーザーが正しい形式で数値を表示するために選択できる別のコントロール (おそらくドロップダウン) をバインドできます (その連絡先で後で使用するために保存できます)。ほとんどの場合、国に基づいて推測できますが、常にそうとは限りません。

多くのマスクが必要になることを理解してください。マスクは常に 10 桁であるとは限りません。NANPA システムは比較的安定していますが、英国の電話番号は混乱しています。地理的エリア コー​​ドは可変長であり、合計数は 10 桁または 11 桁になる可能性があるため、地理的エリア コー​​ドに基づく英国の番号だけに 6 つの異なるマスクがあります。メキシコでは、市外局番は 2 桁または 3 桁で、全部で 10 桁です。フランスの電話番号は 2 桁ずつの 10 桁です。さらに、ダイヤルする数字の実際の組み合わせは、発信元によって異なります。通話が常に米国からの場合、多くのヨーロッパの番号システムは、国内通話に使用される先頭のゼロを削除し、代わりに国番号をダイヤルします.

于 2012-07-17T18:20:53.810 に答える
1

ここに興味深いコード スニペットがあります。電話番号を表示する前にきれいにするために使用できます。

Input: xxxxxxxxxx or xxx-xxx-xxxx or (xxx) xxx-xxxx, Output: (xxx) xxx-xxxx

コード:

private string formatPhoneNumber(string number) {
    System.Text.RegularExpressions.Regex pattern = new System.Text.RegularExpressions.Regex("^\\(?([1-9]\\d{2})\\)?\\D*?([1-9]\\d{2})\\D*?(\\d{4})$");
    Match re = Regex.Match(number, pattern.ToString());
    return "(" + Convert.ToString(re.Groups[1]) + ") " + Convert.ToString(re.Groups[2]) + "-" + Convert.ToString(re.Groups[3]);
}
于 2012-07-17T17:38:01.897 に答える