Преобразует все первые буквы заглавные, остальные ниже для каждого слова


у меня есть строка текста (в основном около 5-6 слов), которую мне нужно преобразовать.

В настоящее время текст выглядит так:

THIS IS MY TEXT RIGHT NOW

Я хочу преобразовать его в:

This Is My Text Right Now

Я могу перебирать свою коллекцию строк, но не уверен, как выполнить эту модификацию текста.

8 96

8 ответов:

string s = "THIS IS MY TEXT RIGHT NOW";

s = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());

Я, вероятно, предпочитаю вызывать ToTitleCase С CultureInfo ( CultureInfo!


есть несколько способов преобразования первого символа строки в верхний регистр.

первый способ-создать метод, который просто закрывает первый символ и добавляет остальную часть строки с помощью подстроки:

public string UppercaseFirst(string s)
    {
        return char.ToUpper(s[0]) + s.Substring(1);
    }

второй способ (который немного быстрее) состоит в том, чтобы разделить строку на массив символов, а затем повторно построить строку:

public string UppercaseFirst(string s)
    {
        char[] a = s.ToCharArray();
        a[0] = char.ToUpper(a[0]);
        return new string(a);
    }

Если вы используете на веб-странице, вы также можете использовать CSS:

style="text-transform:capitalize;"

непроверенные, но что-то вроде этого должно работать:

var phrase = "THIS IS MY TEXT RIGHT NOW";
var rx = new System.Text.RegularExpressions.Regex(@"(?<=\w)\w");
var newString = rx.Replace(phrase,new MatchEvaluator(m=>m.Value.ToLowerInvariant()));

по существу, он говорит: "преформируйте регулярное выражение для всех вхождений буквенно-цифрового символа, который следует за другим буквенно-цифровым символом, а затем замените его строчной версией самого себя"

при построении больших таблиц скорость является проблемой, поэтому вторая функция Джейми Диксона лучше всего, но она не полностью работает как есть...

Он не принимает все буквы в нижнем регистре, и он только заглавными буквами первой буквы строки, а не первой буквы каждого слова в строке... ниже опция устраняет обе проблемы:

    public string UppercaseFirstEach(string s)
    {
        char[] a = s.ToLower().ToCharArray();

        for (int i = 0; i < a.Count(); i++ )
        {
            a[i] = i == 0 || a[i-1] == ' ' ? char.ToUpper(a[i]) : a[i];

        }

        return new string(a);
    }

хотя на данный момент, является ли это все еще самый быстрый вариант-неопределенный,Regex решение Георг Мауэр может быть быстрее... кто-то, кто достаточно заботится, должен проверить это.

Я не знаю, является ли решение ниже более или менее эффективным, чем ответ jspcal, но я уверен, что оно требует меньше создания объектов, чем у Джейми и Джорджа.

string s = "THIS IS MY TEXT RIGHT NOW";
StringBuilder sb = new StringBuilder(s.Length);
bool capitalize = true;
foreach (char c in s) {
    sb.Append(capitalize ? Char.ToUpper(c) : Char.ToLower(c));
    capitalize = !Char.IsLetter(c);
}
return sb.ToString();

в дополнение к первому ответу, не забудьте изменить строку selectionstart индекс до конца слова или вы получите обратный порядок букв в строке.

s.SelectionStart=s.Length;