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

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

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

THIS IS MY TEXT RIGHT NOW

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

THIS IS MY TEXT RIGHT NOW

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

Ответ 1

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

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

Ответ 2

Я, вероятно, предпочитаю вызывать ToTitleCase из CultureInfo (System.Globalization), чем Thread.CurrentThread (System.Threading)

string s = "THIS IS MY TEXT RIGHT NOW";
s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());

но он должен быть таким же, как решение jspcal

ИЗМЕНИТЬ

На самом деле эти решения не одинаковы: CurrentThread --calls → CultureInfo!


System.Threading.Thread.CurrentThread.CurrentCulture

string s = "THIS IS MY TEXT RIGHT NOW";
s = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());

IL_0000:  ldstr       "THIS IS MY TEXT RIGHT NOW"
IL_0005:  stloc.0     // s
IL_0006:  call        System.Threading.Thread.get_CurrentThread
IL_000B:  callvirt    System.Threading.Thread.get_CurrentCulture
IL_0010:  callvirt    System.Globalization.CultureInfo.get_TextInfo
IL_0015:  ldloc.0     // s
IL_0016:  callvirt    System.String.ToLower
IL_001B:  callvirt    System.Globalization.TextInfo.ToTitleCase
IL_0020:  stloc.0     // s

System.Globalization.CultureInfo.CurrentCulture

string s = "THIS IS MY TEXT RIGHT NOW";
s = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());

IL_0000:  ldstr       "THIS IS MY TEXT RIGHT NOW"
IL_0005:  stloc.0     // s
IL_0006:  call        System.Globalization.CultureInfo.get_CurrentCulture
IL_000B:  callvirt    System.Globalization.CultureInfo.get_TextInfo
IL_0010:  ldloc.0     // s
IL_0011:  callvirt    System.String.ToLower
IL_0016:  callvirt    System.Globalization.TextInfo.ToTitleCase
IL_001B:  stloc.0     // s

Литература:

Ответ 3

Здесь есть несколько способов конвертировать первый char строки в верхний регистр.

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

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

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

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

Ответ 4

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

style="text-transform:capitalize;"

Ответ 5

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

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

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

Ответ 6

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

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

    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, предоставленное Джорджем Мауером, может быть быстрее... кто-то, кому это нужно, должен его протестировать.

Ответ 7

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

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

Ответ 8

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

s.SelectionStart=s.Length;

Ответ 9

Попробуйте эту технику; Возвращает желаемый результат

CultureInfo.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());

И не забудьте использовать System.Globalization.

Ответ 10

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

public static string WordsToCapitalLetter(string value)
    {
        if (string.IsNullOrWhiteSpace(value))
        {
            throw new ArgumentException("value");
        }

        int inputValueCharLength = value.Length;
        var valueAsCharArray = value.ToCharArray();

        int min = 0;
        int max = inputValueCharLength - 1;

        while (max > min)
        {
            char left = value[min];
            char previousLeft = (min == 0) ? left : value[min - 1];

            char right = value[max];
            char nextRight = (max == inputValueCharLength - 1) ? right : value[max - 1];

            if (char.IsLetter(left) && !char.IsUpper(left) && char.IsWhiteSpace(previousLeft))
            {
                valueAsCharArray[min] = char.ToUpper(left);
            }

            if (char.IsLetter(right) && !char.IsUpper(right) && char.IsWhiteSpace(nextRight))
            {
                valueAsCharArray[max] = char.ToUpper(right);
            }

            min++;
            max--;
        }

        return new string(valueAsCharArray);
    }