Преобразовать все первые буквы в верхний регистр, оставаясь ниже для каждого слова - PullRequest
105 голосов
/ 22 декабря 2009

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

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

THIS IS MY TEXT RIGHT NOW

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

This Is My Text Right Now

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

Ответы [ 8 ]

242 голосов
/ 22 декабря 2009
string s = "THIS IS MY TEXT RIGHT NOW";

s = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());
82 голосов
/ 27 мая 2010

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

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

но он должен совпадать с решением jspcal

EDIT

На самом деле эти решения не совпадают : 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

Ссылки:

16 голосов
/ 22 декабря 2009

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

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

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);
    }
9 голосов
/ 23 сентября 2013

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

style="text-transform:capitalize;"

8 голосов
/ 22 декабря 2009

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

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 голосов
/ 03 августа 2012

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

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

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

2 голосов
/ 22 декабря 2009

Я не знаю, является ли приведенное ниже решение более или менее эффективным, чем ответ 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();
0 голосов
/ 28 марта 2018

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

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