我将一个文本框绑定到一个类的成员,我需要调整电话号码的外观,以便更容易阅读(用户不想看到诸如“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”)或“+NNNNNNNNNN”(例如“+01234567890”)也可以出现在许多其他排列中,例如:
(NN) NNNN NNNN
++NNNNNNNNNNNNN
+NNNNNNNNNNNNN
+NN NNNNNNNNNNN
NNNNNNNNNNNN
我可以在 phoneBinding_Format() 中做些什么来使这些电话号码更易于阅读,而不会将它们分成无意义的部分,例如“43-4859-4365”而不是“434-859-4365”?
更新
由于这些因素:
1)我同时在做几个项目,需要回到另一个项目 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);
}
}
顺便说一句,在断点必杀技的路上发生了一件有趣的事情:我最初将这些测试(第一个字符是加号,长度是预期的)颠倒过来,得到:System.IndexOutOfRangeException 未被用户代码处理 Message=Index 在数组的边界。
反转条件以便首先检查长度(当长度为 0/字符串为空时自然不会失败)修复它(此后不再尝试访问 char 0)。