B. *_*non 2 c# data-binding formatting winforms
我正在将一个文本框绑定到一个类的成员,我需要调整电话号码的外观,以便它更容易阅读(用户不希望看到诸如"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??
}
Run Code Online (Sandbox Code Playgroud)
但是电话值虽然通常是"NNNNNNNNNN"(例如"1234567890")或"+ NNNNNNNNNNN"(例如"+01234567890")也可以出现在许多其他排列中,例如:
(NN) NNNN NNNN
++NNNNNNNNNNNNN
+NNNNNNNNNNNNN
+NN NNNNNNNNNNN
NNNNNNNNNNNN
Run Code Online (Sandbox Code Playgroud)
我可以在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);
}
}
Run Code Online (Sandbox Code Playgroud)
顺便说一下,在断点必杀技的路上发生了一件有趣的事情:我最初进行了这些测试(第一个字符是一个加号,长度是预期的)反转,得到:System.IndexOutOfRangeException未被用户代码处理消息=索引超出了数组的边界.
反转条件以便首先检查长度(当长度为0 /字符串为空时自然不会失败)修复它(从那时起不会尝试访问char 0).
如果您想支持除美国(和加拿大,与美国100%兼容)号码之外的国际电话号码,Google的LibPhoneNumber可能就是您所需要的.
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
归档时间: |
|
查看次数: |
2134 次 |
最近记录: |