如何将名字大写

问题描述 投票:0回答:9

基本上如果我想改变一个名字

stephen smith

Stephen Smith

我可以使用页面上的 CSS 轻松完成此操作,但理想情况下,我希望尽早捕获它,并在它从数据库中出来时对其进行更改。如何让 C# 将字符串大写?

有这个功能吗?

c# .net
9个回答
79
投票

您可以使用

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));

30
投票

名字很棘手。首字母的简单规则不适用。这里唯一明智的方法是“询问用户”他们想要什么。其他任何事情都可能会引起冒犯。 如果我的名字是 MacPhearson、ODowel,或者只是 marc、Marc 甚至 mArC - 那么坦率地说:别管它。相信用户会做对。当你跨越文化时,这会变得更加棘手。


11
投票
str.Split()

str.Join
一起使用,以将
str
字符串中的每个单词大写。您可以添加对空字符串或一个字符长度字符串的检查。

public static string Capitalize(this string word) { return word.Substring(0, 1).ToUpper() + word.Substring(1).ToLower(); }



4
投票

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 次迭代),所以我不会加快速度考虑选择...


2
投票
for

周期内并使用

Char.ToUpper
 自行对其进行编码。然而,有一些特定于文化的情况,例如名称中使用的阿拉伯单词“bin”、“al”等,这些单词不应大写(前提是使用拉丁语转录)。西方语言中的“von”或“van”也是如此。
请注意,

TextInfo.ToTitleCase

有不同的用途——它并不是为了将人名的首字母大写,而是为了提供标题的正确大小写(就像要清楚的新闻文章的标题一样)。
虽然 .NET 中当前的实现可以轻松满足所请求的目的,但我会避免这样做。原因是将来的实现可能会发生重大变化,因此为人名进行自定义实现会更安全。此外,我怀疑该方法是否真的适用于针对给定文化的字符串标题大小写。例如,在 

Czech

("cs-CZ") 中,正确的标题大小写应仅大写第一个单词的第一个字母

only


2
投票

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"

    第一个非捕获组将匹配任何分词字符或“Mc”/“mc”。
  • 如果它与分词符匹配,则第 1 组和第 2 组为空,第 3 组包含该字符。
  • 如果匹配“Mc”或“mc”,则第 1 组和第 2 组包含“m”和“c”,第 3 组为空。
  • 第 1 组(“m”或“M”)大写。
  • 第 2 组(“c”)保持不变。
  • 第 3 组(中断字符)保持不变。
  • 第 4 组(下一个单词的第一个字母)大写。
  • 所有四个组,无论是空的还是其他的,都被连接起来以生成返回字符串。


2
投票

string.Join(" ", str.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Select(c => c.Substring(0, 1).ToUpper() + c.Substring(1).ToLower()));



1
投票

if (Surname.Contains("'")) { String[] Names = Surname.Split('\'').ToArray(); Surname = textInfo.ToTitleCase(Names[0].ToString()); Surname += "''"; Surname += textInfo.ToTitleCase(Names[1].ToString()); }



0
投票

© www.soinside.com 2019 - 2024. All rights reserved.