c# - 当现有格式不一致时,如何使电话号码变得漂亮/用户友好?

标签 c# winforms data-binding formatting

我将一个文本框绑定(bind)到一个类的成员,我需要调整电话号码的外观以便于阅读(用户不希望看到诸如“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

我可以在 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)。

最佳答案

谷歌的 LibPhoneNumber如果除了美国(和与美国 100% 兼容的加拿大)号码之外,您还想支持国际电话号码,这可能正是您所需要的。

Google's common Java, C++ and Javascript library for parsing, formatting, storing and validating international phone numbers. The Java version is optimized for running on smartphones, and is used by the Android framework since 4.0 (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

关于c# - 当现有格式不一致时,如何使电话号码变得漂亮/用户友好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11527806/

相关文章:

c# - 减少闪烁时使用 C# Listview 模糊文本

c# - 无法从子窗体访问 MDI 父窗体的标签文本

vb.net - PictureBox MouseEnter/MouseLeave 事件未触发

javascript - ajax后的 Angular 数据绑定(bind)

wpf - 在数据网格的组合框列中显示图像

c# - C# 和 Python 之间的通信

c# - 使用 Task 的异步和等待同步方法

c# - 从异步方法更新 GUI

c# - 为什么 IF 语句会影响我的 LINQ 语句的结果?

javascript - 选择下拉列表最初不绑定(bind)到 AngularJS 模型