将字符串转换为标题大小写

Nav*_*een 282 c# string

我有一个字符串,其中包含大写和小写字符混合的单词.

例如: string myData = "a Simple string";

我需要将每个单词的第一个字符(用空格分隔)转换为大写.所以我希望结果如下:string myData ="A Simple String";

有没有简单的方法来做到这一点?我不想拆分字符串并进行转换(这将是我的最后手段).此外,保证字符串是英文的.

Kob*_*obi 513

MSDN:TextInfo.ToTitleCase

确保包括: using System.Globalization

string title = "war and peace";

TextInfo textInfo = new CultureInfo("en-US", false).TextInfo;

title = textInfo.ToTitleCase(title); 
Console.WriteLine(title) ; //War And Peace

//When text is ALL UPPERCASE...
title = "WAR AND PEACE" ;

title = textInfo.ToTitleCase(title); 
Console.WriteLine(title) ; //WAR AND PEACE

//You need to call ToLower to make it work
title = textInfo.ToTitleCase(title.ToLower()); 
Console.WriteLine(title) ; //War And Peace
Run Code Online (Sandbox Code Playgroud)

  • 真正.此外,如果一个单词都是大写,则它不起作用.例如 - "一名联邦调查局特工射杀了我的狗" - >"一名联邦调查局特工射杀了我的狗".它不处理"麦当劳",等等. (37认同)
  • 出于某种原因,当我有"DR"时它不会成​​为"Dr",除非我在调用ToTitleCase()之前先调用.ToLower()......所以这是值得注意的...... (16认同)
  • 如果输入文本为大写,则需要.ToLower()来输入字符串 (14认同)
  • @Kirschstein这个函数*确实*将这些单词转换为标题案例,即使它们不应该是英文的.参见文档:`实际结果:"战争与和平"`. (5认同)
  • @simbolo - 我确实在评论中提到它...你可以使用类似`text = Regex.Replace(text,@"(?<!\ S)\ p {Ll}",m => m.Value .ToUpper());`,但它远非完美.例如,它仍然不处理引号或括号 - ""(一二三)"` - >`"(一二三)"`.在弄清楚你想要对这些案例做些什么之后,你可能想问一个新问题. (5认同)

Win*_*ith 132

试试这个:

string myText = "a Simple string";

string asTitleCase =
    System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.
    ToTitleCase(myText.ToLower());
Run Code Online (Sandbox Code Playgroud)

正如已经指出的那样,使用TextInfo.ToTitleCase可能无法为您提供所需的确切结果.如果您需要更多控制输出,可以执行以下操作:

IEnumerable<char> CharsToTitleCase(string s)
{
    bool newWord = true;
    foreach(char c in s)
    {
        if(newWord) { yield return Char.ToUpper(c); newWord = false; }
        else yield return Char.ToLower(c);
        if(c==' ') newWord = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

var asTitleCase = new string( CharsToTitleCase(myText).ToArray() );
Run Code Online (Sandbox Code Playgroud)

  • @justSteve,来自MSDN(http://msdn.microsoft.com/en-us/library/system.globalization.textinfo.totitlecase%28v=vs.110%29.aspx):"但是,此方法目前不提供适当的套管来转换一个完全大写的单词,例如首字母缩略词" - 你应该只是ToLower()它(我知道这是旧的,但以防万一其他人偶然发现它并想知道为什么!) (6认同)

Tod*_*ier 66

另一种变化.基于这里的一些提示,我已经将它简化为这种扩展方法,这对我的目的非常有用:

public static string ToTitleCase(this string s) =>
    CultureInfo.InvariantCulture.TextInfo.ToTitleCase(s.ToLower());
Run Code Online (Sandbox Code Playgroud)

  • CultureInfo.InvariantCulture.TextInfo.ToTitleCase(s.ToLower()); 实际上会更合适! (8认同)
  • 由于我们使用 InvariantCulture 进行 TitleCasing,因此应使用 s.ToLowerInvariant() 而不是 s.ToLower()。 (2认同)

Lui*_*ada 25

我个人试过这个TextInfo.ToTitleCase方法,但是,我不明白为什么当所有的字符都是大写字母时它不起作用.

虽然我喜欢Winston Smith提供的util函数,但是让我提供我目前正在使用的函数:

public static String TitleCaseString(String s)
{
    if (s == null) return s;

    String[] words = s.Split(' ');
    for (int i = 0; i < words.Length; i++)
    {
        if (words[i].Length == 0) continue;

        Char firstChar = Char.ToUpper(words[i][0]); 
        String rest = "";
        if (words[i].Length > 1)
        {
            rest = words[i].Substring(1).ToLower();
        }
        words[i] = firstChar + rest;
    }
    return String.Join(" ", words);
}
Run Code Online (Sandbox Code Playgroud)

玩一些测试字符串:

String ts1 = "Converting string to title case in C#";
String ts2 = "C";
String ts3 = "";
String ts4 = "   ";
String ts5 = null;

Console.Out.WriteLine(String.Format("|{0}|", TitleCaseString(ts1)));
Console.Out.WriteLine(String.Format("|{0}|", TitleCaseString(ts2)));
Console.Out.WriteLine(String.Format("|{0}|", TitleCaseString(ts3)));
Console.Out.WriteLine(String.Format("|{0}|", TitleCaseString(ts4)));
Console.Out.WriteLine(String.Format("|{0}|", TitleCaseString(ts5)));
Run Code Online (Sandbox Code Playgroud)

给出输出:

|Converting String To Title Case In C#|
|C|
||
|   |
||
Run Code Online (Sandbox Code Playgroud)

  • 这是故意的,因为如果你要求"联合国儿童基金会和慈善机构"获得冠名,你不希望它被改为联合国儿童基金会. (4认同)
  • 因此,不是在整个字符串上调用`ToLower()`,而是自己完成所有这些工作并在每个字符上调用相同的函数?它不仅是一个丑陋的解决方案,它没有带来任何好处,甚至还需要比内置功能更长的时间. (4认同)
  • `rest = words [i] .Substring(1).ToLower();` (3认同)
  • @harsh:我想说的是“丑陋”的解决方案......对我来说毫无意义,你必须首先将整个字符串转换为小写。 (2认同)

小智 21

最近我找到了更好的解决方案.

如果您的文本包含大写的每个字母,则TextInfo不会将其转换为正确的大小写.我们可以通过使用像这样的小写函数来解决这个问题:

public static string ConvertTo_ProperCase(string text)
{
    TextInfo myTI = new CultureInfo("en-US", false).TextInfo;
    return myTI.ToTitleCase(text.ToLower());
}
Run Code Online (Sandbox Code Playgroud)

现在,这将转换为Propercase的所有内容.


小智 15

public static string PropCase(string strText)
{
    return new CultureInfo("en").TextInfo.ToTitleCase(strText.ToLower());
}
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢您在 ToTitleCase 之前添加 ToLower,涵盖输入文本全部大写的情况。 (3认同)

Mib*_*bou 7

如果有人对Compact Framework的解决方案感兴趣:

return String.Join(" ", thestring.Split(' ').Select(i => i.Substring(0, 1).ToUpper() + i.Substring(1).ToLower()).ToArray());
Run Code Online (Sandbox Code Playgroud)


小智 6

这是该问题的解决方案......

CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
TextInfo textInfo = cultureInfo.TextInfo;
string txt = textInfo.ToTitleCase(txt);
Run Code Online (Sandbox Code Playgroud)


DDa*_*Dan 5

ToLower()首先使用,而不是CultureInfo.CurrentCulture.TextInfo.ToTitleCase在结果上获得正确的输出.

    //---------------------------------------------------------------
    // Get title case of a string (every word with leading upper case,
    //                             the rest is lower case)
    //    i.e: ABCD EFG -> Abcd Efg,
    //         john doe -> John Doe,
    //         miXEd CaSING - > Mixed Casing
    //---------------------------------------------------------------
    public static string ToTitleCase(string str)
    {
        return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());
    }
Run Code Online (Sandbox Code Playgroud)