テキストボックスをクラスのメンバーにバインドしています。電話番号の外観を微調整して読みやすくする必要があります (ユーザーは "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 へのアクセスは試行されないため)。