关于字符串:C#格式化 – 如何正确格式化名称?

C# Formatting - How to correctly format a name? I.e. forename or surname

我目前正在被我的系统中显示和输入的所有名称进行视觉攻击。基本上,用户使用的是屏幕键盘,而且不会整齐地写东西!也就是说,约翰·史密斯最终以约翰·史密斯或约翰·史密斯的身份被录取。

我想要一种方法来整齐地输入名字并显示出来。我已经写了一个方法,它遍历所有的名称,并且只执行这个操作,但是它大约有20行代码,而且效率不高。

有没有一个很好的方法来实现这个目标?我试过了.toitlecase(),但它不适用于O'Brien和McCarthy这样的案例?有什么比这更好的吗?我现在的代码基本上有一个特殊情况的列表,如果它们包含特殊情况,我会对它们进行检查和操作…但这并不是世界上最有效率的事情。

事先谢谢。


这真的很重要吗?如果用户不关心他们的名字是大写还是小写,那么我建议您也不必担心这个问题。

关心自己名字如何大写的用户可能会小心地输入自己的名字。

如果你开始搞砸资本化,那么就有可能弄错资本化并冒犯用户。

当然,这个系统还有其他方面需要更多的关注……


我有个客户坚持某种程度的自动格式化。下面的代码正确地解决了所有以前的海报示例。我们只运行一次,并在表单上设置标志,这样,如果用户感到沮丧,可以覆盖自动设置。反馈实际上是非常积极的。希望这能帮助别人。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
public string FormalFormat(string inString)
{
    string outString = string.Empty;
    string _ErrorMessage = string.Empty;
    try
    {
        // Formal Format is made for names and addresses to assure
        // proper formatting and capitalization
        if (string.IsNullOrEmpty(inString))
        {
            return string.Empty;
        }
        inString = inString.Trim();
        if (string.IsNullOrEmpty(inString))
        {
            return string.Empty;
        }
        // see if this is a word or a series of words
        //if(inString.IndexOf("") > 0)
        //{
        // Break out each word in the string.
        char[] charSep = { ' ' };
        string[] aWords = inString.Split(charSep);
        int i = 0;
        int CapAfterHyphen = 0;
        for (i = 0; i < aWords.Length; i++)
        {

            string Word = aWords[i].Trim();
            CapAfterHyphen = Word.IndexOf("-");
            char[] chars = Word.ToCharArray();
            if (chars.Length > 3)
            {
                if (Char.IsLower(chars[1]) && Char.IsUpper(chars[2]))
                {
                    Word = Word.Substring(0, 1).ToUpper() + Word.Substring(1, 1).ToLower() + Word.Substring(2, 1).ToUpper() + Word.Substring(3).ToLower();
                }
                else
                {
                    Word = Word.Substring(0, 1).ToUpper() + Word.Substring(1).ToLower();
                }
            }
            if (CapAfterHyphen > 0)
            {
                Word = Word.Substring(0, CapAfterHyphen + 1) + Word.Substring(CapAfterHyphen + 1, 1).ToUpper() + Word.Substring(CapAfterHyphen + 2);
            }
            if (i > 0)
            {
                outString +="" + Word;
            }
            else
            {
                outString = Word;
            }
        }
    }
    catch (Exception e)
    {
        outString = inString;
        _ErrorMessage = e.Message;
    }
    return outString;
}


正如您已经提出的那样,要做到这一点,没有真正简单的方法,而不必处理那些总是被名字抛出的特殊情况。

此问题有几个建议,可能对您有所帮助:

如何在C中大写名字和姓氏的首字母?


我相信格式化很重要。格式错误的名字在列表或信封上看起来很糟糕(至少在我看来)。我总是觉得有必要把它们正确格式化。这几乎是我的痴迷。

所以,Dand,我就是这样做的:当用户在我的应用程序中输入他们的全名时,我修剪()所有的名称,删除两个空格,然后以适当的大小写格式化所有的名称。然后,我会向用户显示这些名称,提示如下:"我们是否正确格式化了您的名称?"给用户改正格式的机会。在这之后,我只保存名字。祝你好运。


另外,考虑到在某些文化中,它的姓氏先跟在名字后面,只是没有姓氏。

另外,有些名字不只是两三个字。考虑:

  • 曼努埃尔·德拉克鲁兹
  • 肖恩·范·德马克
  • 爱丽丝圣克莱尔
  • 安娜·伊斯特曼·史密斯
  • 宝银
  • 胡志明
  • Julia跑步熊
  • 与灵魂交谈

(最后一个是一个没有姓的美国土著。)


当来自世界各地的中国人、日本人、阿拉伯语、希伯来人和许多其他人加入你的系统时,问题就会出现。

全球化思考。爱尔兰人已经很难相处了:p

也许可以向您的用户展示名称将如何显示,他们会更加小心。