所以我从数据库的所有大写字母中获取姓氏数据。我需要格式化文本,使名称的每个部分的第一个字母大写。目前我有下面的代码,其中包括双姓的人(例如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);
答案 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)\);