基本上如果我想改变一个名字
stephen smith
到
Stephen Smith
我可以使用页面上的 CSS 轻松完成此操作,但理想情况下,我希望尽早捕获它,并在它从数据库中出来时对其进行更改。如何让 C# 将字符串大写?
有这个功能吗?
您可以使用
System.Globalization.TextInfo类的
ToTitleCase
方法来执行此操作:
CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
TextInfo textInfo = cultureInfo.TextInfo;
Console.WriteLine(textInfo.ToTitleCase(title));
Console.WriteLine(textInfo.ToLower(title));
Console.WriteLine(textInfo.ToUpper(title));
名字很棘手。首字母的简单规则不适用。这里唯一明智的方法是“询问用户”他们想要什么。其他任何事情都可能会引起冒犯。 如果我的名字是 MacPhearson、ODowel,或者只是 marc、Marc 甚至 mArC - 那么坦率地说:别管它。相信用户会做对。当你跨越文化时,这会变得更加棘手。
str.Split()
和
str.Join
一起使用,以将 str
字符串中的每个单词大写。您可以添加对空字符串或一个字符长度字符串的检查。public static string Capitalize(this string word)
{
return word.Substring(0, 1).ToUpper() + word.Substring(1).ToLower();
}
string str = "to title case";
Char[] ca = str.ToCharArray();
foreach(Match m in Regex.Matches(str, @"\b[a-z]"))
{
ca[m.Index] = Char.ToUpper(ca[m.Index]);
}
Console.WriteLine(new string(ca));
或者您也可以使用自定义评估器来更改案例,如下所示:
string str = "to title case";
Console.WriteLine(Regex.Replace(str, @"\b[a-z]", delegate (Match m)
{
return m.Value.ToUpper();
}
));
,在我进行 1,000,000 次迭代的测试中,第一种方法仅比使用评估器的方法快 0.48 秒(第一个方法花了 6.88 秒,后一个方法花了 7.36 秒来完成 1,000,000 次迭代),所以我不会加快速度考虑选择...
for
周期内并使用
Char.ToUpper
自行对其进行编码。然而,有一些特定于文化的情况,例如名称中使用的阿拉伯单词“bin”、“al”等,这些单词不应大写(前提是使用拉丁语转录)。西方语言中的“von”或“van”也是如此。请注意,有不同的用途——它并不是为了将人名的首字母大写,而是为了提供标题的正确大小写(就像要清楚的新闻文章的标题一样)。 虽然 .NET 中当前的实现可以轻松满足所请求的目的,但我会避免这样做。原因是将来的实现可能会发生重大变化,因此为人名进行自定义实现会更安全。此外,我怀疑该方法是否真的适用于针对给定文化的字符串标题大小写。例如,在 Czech
("cs-CZ"
) 中,正确的标题大小写应仅大写第一个单词的第一个字母
only。
Regex.Replace(Name, @"(?:(M|m)(c)|(\b))([a-z])", delegate(Match m) {
return String.Concat(m.Groups[1].Value.ToUpper(), m.Groups[2].Value, m.Groups[3].Value, m.Groups[4].Value.ToUpper());
});
除了标题大小写之外,这将正确地大写 McNames。例如,
"simon mcguinnis" → "Simon McGuinnis"
string.Join(" ", str.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Select(c => c.Substring(0, 1).ToUpper() + c.Substring(1).ToLower()));
if (Surname.Contains("'"))
{
String[] Names = Surname.Split('\'').ToArray();
Surname = textInfo.ToTitleCase(Names[0].ToString());
Surname += "''";
Surname += textInfo.ToTitleCase(Names[1].ToString());
}