Ответ 1
string s = "THIS IS MY TEXT RIGHT NOW";
s = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());
У меня есть строка текста (в основном около 5-6 слов), которую мне нужно преобразовать.
В настоящее время текст выглядит так:
THIS IS MY TEXT RIGHT NOW
Я хочу преобразовать его в:
THIS IS MY TEXT RIGHT NOW
Я могу пропустить свою коллекцию строк, но не знаю, как это сделать.
string s = "THIS IS MY TEXT RIGHT NOW";
s = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());
Я, вероятно, предпочитаю вызывать 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
Литература:
Здесь есть несколько способов конвертировать первый 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);
}
Если вы используете на веб-странице, вы также можете использовать 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, но я уверен, что он требует меньше создания объекта, чем 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();
В дополнение к первому ответу, не забудьте изменить индекс строки выбора строки до конца слова, иначе вы получите обратный порядок букв в строке.
s.SelectionStart=s.Length;
Попробуйте эту технику; Возвращает желаемый результат
CultureInfo.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());
И не забудьте использовать System.Globalization
.
Одно из возможных решений, которые могут вас заинтересовать. Обход массива символов справа налево и наоборот в одном цикле.
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);
}