Преобразование строки в заголовок
У меня есть строка, которая содержит слова в смеси символов верхнего и нижнего регистра.
Например: string myData = "a Simple string";
Мне нужно преобразовать первый символ каждого слова (разделенных пробелами) в верхний регистр. Поэтому я хочу получить результат как: string myData ="A Simple String";
Есть ли простой способ сделать это? Я не хочу разбивать строку и делать преобразование (это будет моим последним средством). Также гарантируется, что строки на английском языке.
Ответы
Ответ 1
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
Ответ 2
Попробуйте следующее:
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() );
Ответ 3
Еще один вариант. Основываясь на нескольких советах, я сократил его до этого метода расширения, который отлично подходит для моих целей:
public static string ToTitleCase(this string s) =>
CultureInfo.InvariantCulture.TextInfo.ToTitleCase(s.ToLower());
Ответ 4
Лично я попробовал метод TextInfo.ToTitleCase
, но я не понимаю, почему он не работает, когда все символы имеют верхний регистр.
Хотя мне нравится функция утилиты, предоставляемая 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|
||
| |
||
Ответ 5
Недавно я нашел лучшее решение.
Если ваш текст содержит каждую букву в верхнем регистре, TextInfo не будет преобразовывать его в соответствующий регистр. Мы можем исправить это, используя функцию нижнего регистра внутри:
public static string ConvertTo_ProperCase(string text)
{
TextInfo myTI = new CultureInfo("en-US", false).TextInfo;
return myTI.ToTitleCase(text.ToLower());
}
Теперь это преобразует все, что входит в Propercase.
Ответ 6
public static string PropCase(string strText)
{
return new CultureInfo("en").TextInfo.ToTitleCase(strText.ToLower());
}
Ответ 7
Если кто-то заинтересован в решении для Compact Framework:
return String.Join(" ", thestring.Split(' ').Select(i => i.Substring(0, 1).ToUpper() + i.Substring(1).ToLower()).ToArray());
Ответ 8
Здесь решение этой проблемы...
CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
TextInfo textInfo = cultureInfo.TextInfo;
string txt = textInfo.ToTitleCase(txt);
Ответ 9
Сначала используйте 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());
}
Ответ 10
Лучше понять, попробовав свой собственный код...
Подробнее
http://www.stupidcodes.com/2014/04/convert-string-to-uppercase-proper-case.html
1) Преобразование строки в верхний регистр
string lower = "converted from lowercase";
Console.WriteLine(lower.ToUpper());
2) Преобразование строки в нижний регистр
string upper = "CONVERTED FROM UPPERCASE";
Console.WriteLine(upper.ToLower());
3) Преобразование строки в TitleCase
CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
TextInfo textInfo = cultureInfo.TextInfo;
string txt = textInfo.ToTitleCase(TextBox1.Text());
Ответ 11
Мне нужен был способ справиться со всеми ключевыми словами, и мне понравилось решение Ricky AH, но я сделал еще один шаг, чтобы реализовать его как метод расширения. Это позволяет избежать создания массива символов, а затем вызывать 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;
}
}
}
Ответ 12
Вот реализация, характер по характеру. Должен работать с "(Один Два Три)"
public static string ToInitcap(this string str)
{
if (string.IsNullOrEmpty(str))
return str;
char[] charArray = new char[str.Length];
bool newWord = true;
for (int i = 0; i < str.Length; ++i)
{
Char currentChar = str[i];
if (Char.IsLetter(currentChar))
{
if (newWord)
{
newWord = false;
currentChar = Char.ToUpper(currentChar);
}
else
{
currentChar = Char.ToLower(currentChar);
}
}
else if (Char.IsWhiteSpace(currentChar))
{
newWord = true;
}
charArray[i] = currentChar;
}
return new string(charArray);
}
Ответ 13
String TitleCaseString(String s)
{
if (s == null || s.Length == 0) return s;
string[] splits = s.Split(' ');
for (int i = 0; i < splits.Length; i++)
{
switch (splits[i].Length)
{
case 1:
break;
default:
splits[i] = Char.ToUpper(splits[i][0]) + splits[i].Substring(1);
break;
}
}
return String.Join(" ", splits);
}
Ответ 14
Вы можете напрямую изменить текст или строку на правильные, используя этот простой метод, после проверки на наличие нулевых или пустых значений строки для устранения ошибок:
public string textToProper(string text)
{
string ProperText = string.Empty;
if (!string.IsNullOrEmpty(text))
{
ProperText = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(text);
}
else
{
ProperText = string.Empty;
}
return ProperText;
}
Ответ 15
Попробуйте следующее:
using System.Globalization;
using System.Threading;
public void ToTitleCase(TextBox TextBoxName)
{
int TextLength = TextBoxName.Text.Length;
if (TextLength == 1)
{
CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
TextInfo textInfo = cultureInfo.TextInfo;
TextBoxName.Text = textInfo.ToTitleCase(TextBoxName.Text);
TextBoxName.SelectionStart = 1;
}
else if (TextLength > 1 && TextBoxName.SelectionStart < TextLength)
{
int x = TextBoxName.SelectionStart;
CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
TextInfo textInfo = cultureInfo.TextInfo;
TextBoxName.Text = textInfo.ToTitleCase(TextBoxName.Text);
TextBoxName.SelectionStart = x;
}
else if (TextLength > 1 && TextBoxName.SelectionStart >= TextLength)
{
CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
TextInfo textInfo = cultureInfo.TextInfo;
TextBoxName.Text = textInfo.ToTitleCase(TextBoxName.Text);
TextBoxName.SelectionStart = TextLength;
}
}
Вызвать этот метод в событии TextChanged текстового поля.
Ответ 16
Я использовал приведенные выше ссылки, и полное решение: -
Use Namespace System.Globalization;
string str="INFOA2Z means all information";
//Требуется результат, например, "Infoa2z означает всю информацию"
// Нам также нужно преобразовать строку в нижнем регистре, иначе она не работает должным образом.
TextInfo ProperCase= new CultureInfo("en-US", false).TextInfo;
str= ProperCase.ToTitleCase(str.toLower());
http://www.infoa2z.com/asp.net/change-string-to-proper-case-in-an-asp.net-using-c#
Ответ 17
Это то, что я использую, и он работает в большинстве случаев, если пользователь не решит переопределить его, нажав кнопку "Сдвиг" или "Заблокировать". Как на клавиатурах Android и iOS.
Private Class ProperCaseHandler
Private Const wordbreak As String = " ,.1234567890;/\-()#$%^&*€[email protected]"
Private txtProperCase As TextBox
Sub New(txt As TextBox)
txtProperCase = txt
AddHandler txt.KeyPress, AddressOf txtTextKeyDownProperCase
End Sub
Private Sub txtTextKeyDownProperCase(ByVal sender As System.Object, ByVal e As Windows.Forms.KeyPressEventArgs)
Try
If Control.IsKeyLocked(Keys.CapsLock) Or Control.ModifierKeys = Keys.Shift Then
Exit Sub
Else
If txtProperCase.TextLength = 0 Then
e.KeyChar = e.KeyChar.ToString.ToUpper()
e.Handled = False
Else
Dim lastChar As String = txtProperCase.Text.Substring(txtProperCase.SelectionStart - 1, 1)
If wordbreak.Contains(lastChar) = True Then
e.KeyChar = e.KeyChar.ToString.ToUpper()
e.Handled = False
End If
End If
End If
Catch ex As Exception
Exit Sub
End Try
End Sub
End Class
Ответ 18
Для тех, кто хочет сделать это автоматически при нажатии клавиши, я сделал это со следующим кодом в vb.net в настраиваемом текстовом управлении - вы также можете сделать это с помощью обычного текстового поля, но мне нравится возможность добавлять повторяющийся код для конкретных элементов управления с помощью настраиваемых элементов управления он подходит к концепции ООП.
Imports System.Windows.Forms
Imports System.Drawing
Imports System.ComponentModel
Public Class MyTextBox
Inherits System.Windows.Forms.TextBox
Private LastKeyIsNotAlpha As Boolean = True
Protected Overrides Sub OnKeyPress(e As KeyPressEventArgs)
If _ProperCasing Then
Dim c As Char = e.KeyChar
If Char.IsLetter(c) Then
If LastKeyIsNotAlpha Then
e.KeyChar = Char.ToUpper(c)
LastKeyIsNotAlpha = False
End If
Else
LastKeyIsNotAlpha = True
End If
End If
MyBase.OnKeyPress(e)
End Sub
Private _ProperCasing As Boolean = False
<Category("Behavior"), Description("When Enabled ensures for automatic proper casing of string"), Browsable(True)>
Public Property ProperCasing As Boolean
Get
Return _ProperCasing
End Get
Set(value As Boolean)
_ProperCasing = value
End Set
End Property
End Class
Ответ 19
Прекрасно работает даже в случае с верблюдом: "SomeText in YourPage"
public static class StringExtensions
{
/// <summary>
/// Title case example: 'Some Text In Your Page'.
/// </summary>
/// <param name="text">Support camel and title cases combinations: 'someText in YourPage'</param>
public static string ToTitleCase(this string text)
{
if (string.IsNullOrEmpty(text))
{
return text;
}
var result = string.Empty;
var splitedBySpace = text.Split(new[]{ ' ' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var sequence in splitedBySpace)
{
// let check the letters. Sequence can contain even 2 words in camel case
for (var i = 0; i < sequence.Length; i++)
{
var letter = sequence[i].ToString();
// if the letter is Big or it was spaced so this is a start of another word
if (letter == letter.ToUpper() || i == 0)
{
// add a space between words
result += ' ';
}
result += i == 0 ? letter.ToUpper() : letter;
}
}
return result.Trim();
}
}
Ответ 20
Как метод расширения:
/// <summary>
// Returns a copy of this string converted to 'Title Case'.
/// </summary>
/// <param name="value">The string to convert.</param>
/// <returns>The 'Title Case' equivalent of the current string.</returns>
public static string ToTitleCase(this string value)
{
string result = string.Empty;
for (int i = 0; i < value.Length; i++)
{
char p = i == 0 ? char.MinValue : value[i - 1];
char c = value[i];
result += char.IsLetter(c) && ((p is ' ') || p is char.MinValue) ? $"{char.ToUpper(c)}" : $"{char.ToLower(c)}";
}
return result;
}
Использование:
"kebab is DELICIOU ;d c...".ToTitleCase();
Результат:
Kebab Is Deliciou ;d C...
Ответ 21
Альтернатива со ссылкой на Microsoft.VisualBasic
(также обрабатывает строчные буквы):
string properCase = Strings.StrConv(str, VbStrConv.ProperCase);
Ответ 22
Я знаю, что это старый вопрос, но я искал то же самое для C, и я понял это, поэтому решил, что опубликую его, если кто-то ищет способ в C:
char proper(char string[]){
int i = 0;
for(i=0; i<=25; i++)
{
string[i] = tolower(string[i]); //converts all character to lower case
if(string[i-1] == ' ') //if character before is a space
{
string[i] = toupper(string[i]); //converts characters after spaces to upper case
}
}
string[0] = toupper(string[0]); //converts first character to upper case
return 0;
}