姓氏首字母大写
本文关键字: | 更新日期: 2023-09-27 18:17:26
所以我从数据库中获得所有大写的姓氏数据。我需要格式化文本,使每个部分的首字母大写的名字。目前,我有下面的代码,说明了有两个姓氏的人(例如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);
这是一个已知的名称问题-事情非常不一致。阅读本文获取更多信息:http://www.w3.org/International/questions/qa-personal-names
在您的示例中,您引用了姓氏"VAN BEBBER",您希望将其大写为"Van Bebber"。然而,正如文章所指出的,来自世界其他地区的其他组合会破坏大多数标准化的尝试-例如,姓氏"BIN OSMAN"将被适当地大写为"BIN Osman"-"BIN"不大写"b",意思是"儿子",因此不太符合西化的姓氏概念。
你提到你用破折号来分割姓氏,这很可能来自于用连字符连接姓氏的想法——你也会检查名字中的破折号吗?该网站给出的示例名称为"María-Jose Carreño Quiñones"——由于双名(用连字符分隔)和双姓(用空格分隔),该名称很难解析。你的节目用这个名字怎么样?
为了更直接地回答你的问题,而不引入更多的边缘情况-你已经知道如何通过破折号分割字符串-如果你想用空格覆盖姓氏的情况,你应该进一步用空格分割姓氏字符串,然后才将不同分割字符串的第一个字母大写。
或者,正如Dai在评论中提到的,您可以使用ToTitleCase
方法-更多信息在这里:https://msdn.microsoft.com/en-us/library/system.globalization.textinfo.totitlecase(v=vs.110).aspx这可能是比尝试自己制作更好的解决方案。然而,本页提到的事实是,并非所有语言都以相同的方式大写(实际上,不同的姓氏可能来自不同的地区/文化/语言),因此设置正确的语言可能并不总是产生正确的姓氏大写。请注意,它将"BIN OSMAN"大写为"Bin Osman",这在技术上是不正确的。
下面是该页中的一个快速示例:
// 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 )
我认为你可以使用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));
为什么不先用空格再用'-'分隔呢?这样就可以捕获所有实例。
请看下面的例子:
var names = fullName.Split(' ');
var formatted = new StringBuilder();
foreach(string name in names)
{
if(name.Contains('-'))
{
var nonHyphanatedNames = name.Split('-');
foreach (var nonHyphanatedName in nonHyphanatedNames)
{
formatted.Append(char.ToUpper(nonHyphanatedName[0]) + nonHyphanatedName.Substring(1).ToLower() + '-');
}
}
else
{
formatted.Append(char.ToUpper(name[0]) + name.Substring(1).ToLower() + ' ');
}
}
//remove last field
formatted.Remove(formatted.Length - 1, 1);
Console.Write(formatted);