Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当电话号码的现有格式不一致时,如何使其美观/便于使用?_C#_Winforms_Data Binding_Formatting - Fatal编程技术网

C# 当电话号码的现有格式不一致时,如何使其美观/便于使用?

C# 当电话号码的现有格式不一致时,如何使其美观/便于使用?,c#,winforms,data-binding,formatting,C#,Winforms,Data Binding,Formatting,我正在将一个文本框绑定到一个类的成员,我需要调整电话号码的外观,以便更易于阅读(用户不希望看到诸如“1234567890”或“+01234567890”之类的值)。所以,我有这个代码: var bindingPhone = new Binding("Text", platypusInfo, "Phone1", true); bindingPhone.Format += phoneBinding_Format; textBoxPhoneNum1.DataBindings.Add(bindingPh

我正在将一个文本框绑定到一个类的成员,我需要调整电话号码的外观,以便更易于阅读(用户不希望看到诸如“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??
}
但是,尽管电话值通常为“nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn

 (NN) NNNN NNNN
++NNNNNNNNNNNNN
+NNNNNNNNNNNNN
+NN NNNNNNNNNNN
NNNNNNNNNNNN
我能用phoneBinding_uformat()来做什么,这样可以让这些电话号码更容易阅读,而不把它们分解成非理性的部分,比如“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);
    }
}
顺便说一句,在中断nirvana的过程中发生了一件有趣的事情:我最初将这些测试(第一个字符是加号,长度是预期的)颠倒过来,得到了:System.IndexOutOfRangeException没有被用户代码处理 Message=索引超出了数组的边界

反转条件,以便首先检查长度(当长度为0/字符串为空时,这自然不会失败)修复了它(因为此后不会尝试访问字符0)。

有趣的代码片段。可用于在显示电话号码之前对其进行整理

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]);
}

我个人会指定只允许数字电话号码(这意味着用户不能输入像1-800-FLOWERS这样的电话号码),然后去掉所有非数字字符,格式化之前。

最简单的方法是在应用格式化之前从字符串中去掉所有非数字字符和空白

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

<谷歌> java、C++和JavaScript库,用于解析、格式化、存储和验证国际电话号码。Java版本是为在智能手机上运行而优化的,自4.0(冰激凌三明治)以来,Android框架一直在使用它

从C#使用它:

C#端口


我得到的是,数字以十位字符格式(“1234567890”)存储,没有格式,但现在需要添加格式,使数字更可读,而不会使数字对使用该数字的国家毫无意义。由于不同国家/地区的号码有不同的默认格式,NANPA系统(ACD)COX-SUB(区号、中央办公室和订户)并不总是适用

我的建议是维护一个电话号码掩码表或字典,然后使用MaskedTextBox,不仅将号码绑定到联系人对象中的数据,还将掩码绑定到联系人对象中的数据

例如,电话掩码ID 1可能用于NANPA号码:“000-000-0000”。电话掩码ID 2可能用于伦敦地铁号码,可能为“\000 0000 0000”(前导数字始终为零,从国外拨打电话时应省略)。ID 3可能代表法语电话号码:“00”。您可以在对象上指定一个“get only”属性,该属性将向文本框提供实际的掩码字符串,并绑定一个不同的控件(可能是下拉列表),用户可以选择该控件以正确的格式显示号码(您可以将其保存以供以后与该联系人一起使用)。大多数情况下,你可以根据国家进行猜测,但情况并非总是如此


要知道你需要很多面具,它们并不总是十位数。虽然NANPA系统相对一致,但英国的电话号码却乱七八糟;地理区号是可变长度的,总数字可以是10或11位,因此,根据地理区号,英国数字有六个不同的掩码。在墨西哥,区号可以是两位数或三位数,总数字是十位数。法国电话号码是两个一组的十位数字。此外,要拨打的数字的实际组合取决于您从何处拨打电话;如果电话总是从美国打来,许多欧洲号码系统会放弃用于国内通话的前导零,而改拨国家代码。

不幸的是,“无意义”可能是一个相对术语。例如,在一些国家,“43-3859-3465”是一个完全有效的电话号码。这个有趣的片段有什么作用?没有解释,答案不是很有用…感谢您提供的澄清。。。如果数字在德国,OP想要支持的国家的格式可以是+49-89-123456或+49-45563-1234,那么他必须添加自己的例程,可以解析特定国家的数字。希望没有人输入1-800-FLOWERS@EricJ. 哈哈,说得好。我个人讨厌那些使用比实际输入的号码长的单词的电话号码。它激怒了我。是的,但好的800数字很难得到:-)把你的答案改成非字母数字,它就会起作用。@EricJ。我想说,让用户只输入数字值通常是一个OK的规定。这800个数字都是数字,否则你就是自找麻烦。@Stefan:我无法指定/调节用户输入的电话号码或它们在数据库中的存储方式;我正在处理的这些值已经在数据库中,并且已经/正在被遗留应用程序放在那里。希望没有人输入1-800-SOLIDCODE。我会买非字母数字的字符:-)@EricJ:好吧,这取决于设计,以确定是否需要处理该案件。如果是这样的话,我会改变我的正则表达式或者别的什么,只去掉no