姓氏首字母的大写字母

时间:2015-10-13 17:09:08

标签: c# string formatting

所以我从数据库的所有大写字母中获取姓氏数据。我需要格式化文本,使名称的每个部分的第一个字母大写。目前我有下面的代码,其中包括双姓的人(例如SMITH-JONES成为Smith-Jones),但在检查结果时,我注意到我仍然有一个错误,就像VAN BEBBER这样的名字变成了Van bebber。有什么建议吗?

            var fullLast = Last.Split('-');
            var lastFormatted = new StringBuilder();
            for(var i = 0; i < fullLast.Length; i++)
            {
                fullLast[i] = char.ToUpper(fullLast[i][0]) + fullLast[i].Substring(1).ToLower();
                lastFormatted.Append(fullLast[i]);
                if(i != fullLast.Length - 1)
                    lastFormatted.Append("-");
            }

            return string.Format(
                "{0} {1}",
                char.ToUpper(First[0]) + First.Substring(1).ToLower(),
                lastFormatted);

3 个答案:

答案 0 :(得分:2)

这是一个已知的名称问题 - 事情非常不一致。阅读本文以获取更多信息:http://www.w3.org/International/questions/qa-personal-names

在您的示例中,您引用姓氏“VAN BEBBER”,您希望将其大写为“ V B ebber”。然而,正如文章指出的那样,世界其他地区还有其他组合会破坏大多数标准化尝试 - 例如,姓氏“BIN OSMAN”将被正确地大写为“bin O sman“ - 没有资本”b“代表”bin“,意思是”儿子“,因此不适合西方化的姓氏概念。

你提到你用破折号分割姓氏,这很可能来自一个带连字符的姓氏 - 你也检查破折号的名字吗?该网站给出了“María-JoseCarreñoQuiñones”的示例名称 - 由于双重名字(用连字符分隔)以及双姓(用空格分隔),因此很难解析。你的程序如何以该名称公平?

更直接地回答你的问题,而不会带来更多边缘情况 - 你已经知道如何通过破折号分割字符串 - 如果你想要用空格覆盖姓氏的情况,你应该进一步拆分姓氏字符串按空格,然后只将不同分割字符串的第一个字母大写。

或者,正如戴在评论中提到的那样,您可以使用ToTitleCase方法 - 更多信息请点击此处:https://msdn.microsoft.com/en-us/library/system.globalization.textinfo.totitlecase(v=vs.110).aspx这可能是比尝试制作自己的更好的解决方案。但是,此页面引用的事实是,并非所有语言都以相同的方式大写(实际上,不同的姓氏可能来自不同的区域/文化/语言),因此设置正确的语言可能并不总是产生正确的姓氏大写。请注意,它会将“BIN OSMAN”大写为“ B O sman”,这在技术上是不正确的。

以下是该页面的简短示例:

// Defines the String* with mixed casing.
String^ myString = "wAr aNd pEaCe";

// Creates a TextInfo based on the "en-US" culture.
/**** Personal Note - en-US may not be the correct culture for every last name! ****/
CultureInfo^ MyCI = gcnew CultureInfo( "en-US",false );
TextInfo^ myTI = MyCI->TextInfo;

// Changes a String* to lowercase. Outputs "War and Peace"
Console::WriteLine( "\"{0}\" to titlecase: {1}", myString, myTI->ToTitleCase( myString )

答案 1 :(得分:1)

我认为您可以使用ToTitleCase方法....

CultureInfo cultureInfo = CultureInfo.CurrentCulture; //Or use a specific culture
var str1 = cultureInfo.TextInfo.ToTitleCase("VAN BEBBER".ToLower(cultureInfo));
var str2 = cultureInfo.TextInfo.ToTitleCase("SMITH-JONES".ToLower(cultureInfo));

答案 2 :(得分:0)

为什么不按空格划分,然后按' - '划分。这样你就可以捕获所有的实例。

见这个例子:

apple\(0*(\d|[1-9]\d|100),0*(\d|[1-9]\d|100)\);