C# 如何大写姓名

C# 如何大写姓名,c#,.net,C#,.net,所以基本上如果我想从 stephen smith 到 我可以很容易地在页面上使用comecss,但理想情况下,我希望更早地捕获它,并在它从数据库中出来时进行更改。如何让csharp将字符串大写 是否有此功能?您可以使用类的ToTitleCase方法执行此操作: 不,没有。如果您知道正在处理的字符串是一个名称(或者更确切地说,是由空格分隔的人名序列),您应该能够在一个周期内自己对其进行编码并使用。但是,在名称中使用阿拉伯词“bin”、“al”等特定于文化的情况下,不应大写(前提是使用拉丁语抄本

所以基本上如果我想从

stephen smith 

我可以很容易地在页面上使用comecss,但理想情况下,我希望更早地捕获它,并在它从数据库中出来时进行更改。如何让csharp将字符串大写


是否有此功能?

您可以使用类的
ToTitleCase
方法执行此操作:


不,没有。如果您知道正在处理的字符串是一个名称(或者更确切地说,是由空格分隔的人名序列),您应该能够在一个
周期内自己对其进行编码并使用。但是,在名称中使用阿拉伯词“bin”、“al”等特定于文化的情况下,不应大写(前提是使用拉丁语抄本)。西方语言中的“von”或“van”也是如此

更新:请注意,有不同的用途——它不是要大写人名的首字母,而是要提供标题的适当大小写(如要清楚的新闻文章标题)


尽管.NET中当前的实现可以很容易地达到所要求的目的,但我还是避免这样做。原因是实现在未来可能会发生重大变化,因此为人名定制实现更安全。此外,我怀疑该方法是否真的适用于给定区域性的字符串标题大小写。例如,在捷克语(
“cs CZ”
)中,适当的标题大小写应该仅大写第一个单词的第一个字母。

名称很难理解。首字母的简单规则不适用。这里唯一明智的方法是询问您的用户他们想要什么。其他任何事情都可能引起冒犯

如果我的名字是麦克费尔森,奥多威尔,或者只是马克,马克,甚至马克-那么坦白地说:别管它。相信用户能够正确地进行操作。当你在不同的文化之间穿梭时,这会变得更加棘手。

希望这有帮助:)。。。但是请注意,如果您有很多字符串需要更改,那么这个过程很可能会很慢

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

注意在我的1000000次迭代测试中,第一种方法仅比使用evaluator的方法快0.48秒(第一种方法需要6.88秒,后一种方法需要7.36秒才能完成1000000次迭代)所以我不会考虑速度来选择任何一个…

对Pedro给出的答案稍加扩展:

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());
 });
除标题大小写外,这将正确大写MCNAME。如 “西蒙·麦吉尼斯”->“西蒙·麦吉尼斯”

  • 第一个非捕获组将匹配任何分词字符或“Mc”/“Mc”
  • 如果与分词符匹配,则组1和2为空,组3包含该字符
  • 如果匹配“Mc”或“Mc”,则组1和2包含“m”和“c”,组3为空

    • 第1组(“m”或“m”)资本化
    • 第2组(“c”)未更改
    • 第3组(中断字符)保持不变
    • 第4组(下一个单词的第一个字母)大写

所有4个组,无论是否为空,都被连接起来以生成返回字符串。

对于姓氏中带有“字符”的我来说,这很有效

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

这是字符串类上的扩展方法,它将单个单词大写。您可以将它与
str.Split()
str.Join
一起使用,将
str
字符串的每个单词大写。您可以添加空字符串或单字符长度字符串的检查

public static string Capitalize(this string word)
{
    return word.Substring(0, 1).ToUpper() + word.Substring(1).ToLower();
}
我使用单线:

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

在使用ToTileCase()之前,阅读它的描述是非常重要的。我认为它不是很“好”。它的行为甚至还没有定义(类似于“它照它做的去做”。)注释很奇妙:“我们保留在将来使这个API变慢的权利。”-1,对不起,但是
ToTitleCase
用于标题中大小写的标准化,比如新闻文章的标题,但不用于人名。因此,对于实际的区域性,您可能最终会得到一个不想要的结果。我认为,使用任何自动字符串格式化方法,都会出现一些边缘情况,即生成的值不是预期的100%,即使用类似于
d'Ythaq
的姓氏。但是,这绝对是.Net Framework中目前可用的最好的人名大小写方法,除了自己编写一个可以处理边缘情况的方法之外。@Dexter您错了。书名大小写与人名无关。对于程序员来说,人名和书名没有任何区别!(引文:Xanatos,2010年2月20日):-):-)只有一条评论:除非用户是名称的“所有者”,否则用户可能是最不适合询问的人。即使是它的主人,也只有一半。Teh(写为Teh)短信的生成很容易忽略“正确的”案例规则。好吧,它更像是一个管理员的事情,它是用户。这些名字是我们在网站上看到的拳击手的名字,我们的用户输入的并不是什么@史蒂夫不是你系统的管理员用户吗?@Steve正如Marc暗示的那样,你会遇到很多英国/苏格兰/爱尔兰名字的问题,这些名字不仅首字母大写。与你的问题的标题框+1相比,其他语言可能有类似的奇怪之处,因为回答表明“美丽”和“正确”不是计算机的领域:-)美丽(和正确性)在旁观者的眼中!-)
public static string Capitalize(this string word)
{
    return word.Substring(0, 1).ToUpper() + word.Substring(1).ToLower();
}
string.Join(" ", str.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Select(c => c.Substring(0, 1).ToUpper() + c.Substring(1).ToLower()));