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
也许可以向您的用户展示名称将如何显示,他们会更加小心。