Преобразование строки в заголовок - PullRequest
264 голосов
/ 30 июля 2009

У меня есть строка, которая содержит слова в смеси символов верхнего и нижнего регистра.

Например: string myData = "a Simple string";

Мне нужно преобразовать первый символ каждого слова (разделенный пробелами) в верхний регистр. Поэтому я хочу получить результат как: string myData ="A Simple String";

Есть ли простой способ сделать это? Я не хочу разбивать строку и делать преобразование (это будет моим последним средством). Также гарантируется, что строки на английском языке.

Ответы [ 21 ]

481 голосов
/ 30 июля 2009

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
131 голосов
/ 30 июля 2009

Попробуйте это:

string myText = "a Simple string";

string asTitleCase =
    System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.
    ToTitleCase(myText.ToLower());

Как уже указывалось, использование 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;
    }
}

А затем используйте его так:

var asTitleCase = new string( CharsToTitleCase(myText).ToArray() );
59 голосов
/ 05 июня 2014

Еще один вариант. Основываясь на нескольких советах, я сократил его до этого метода расширения, который отлично подходит для моих целей:

public static string ToTitleCase(this string s) =>
    CultureInfo.InvariantCulture.TextInfo.ToTitleCase(s.ToLower());
23 голосов
/ 17 февраля 2012

Лично я попробовал метод TextInfo.ToTitleCase, но я не понимаю, почему он не работает, когда все символы в верхнем регистре.

Хотя мне нравится функция util, предоставляемая Winston Smith , позвольте мне предоставить функцию, которую я сейчас использую:

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

Игра с некоторыми тестами строк:

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

Даёт Вывод :

|Converting String To Title Case In C#|
|C|
||
|   |
||
20 голосов
/ 18 августа 2013

Недавно я нашел лучшее решение.

Если ваш текст содержит все буквы в верхнем регистре, то TextInfo не будет преобразовывать его в соответствующий регистр. Мы можем исправить это, используя функцию нижнего регистра внутри:

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

Теперь это преобразует все, что входит в Propercase.

15 голосов
/ 03 декабря 2013
public static string PropCase(string strText)
{
    return new CultureInfo("en").TextInfo.ToTitleCase(strText.ToLower());
}
7 голосов
/ 13 марта 2014

Если кто-то заинтересован в решении для Compact Framework:

return String.Join(" ", thestring.Split(' ').Select(i => i.Substring(0, 1).ToUpper() + i.Substring(1).ToLower()).ToArray());
6 голосов
/ 17 января 2013

Вот решение этой проблемы ...

CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
TextInfo textInfo = cultureInfo.TextInfo;
string txt = textInfo.ToTitleCase(txt);
5 голосов
/ 16 мая 2016

Сначала используйте 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());
    }
2 голосов
/ 11 апреля 2014

Мне нужен был способ справиться со всеми заглавными словами, и мне понравилось решение Рикки А.Х., но я сделал шаг вперед, чтобы реализовать его как метод расширения. Это избавляет от необходимости создавать свой массив символов, а затем каждый раз явно вызывать для него ToArray - так что вы можете просто вызвать его в строке, например:

использование:

string newString = oldString.ToProper();

Код:

public static class StringExtensions
{
    public static string ToProper(this string s)
    {
        return new string(s.CharsToTitleCase().ToArray());
    }

    public static IEnumerable<char> CharsToTitleCase(this 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;
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...