Conversão de string em checkbox de título

Eu tenho uma string que contém palavras em uma mistura de caracteres maiúsculos e minúsculos.

Por exemplo: string myData = "a Simple string";

Eu preciso converter o primeiro caractere de cada palavra (separado por espaços) em maiúsculas. Então eu quero o resultado como: string myData ="A Simple String";

Existe alguma maneira fácil de fazer isso? Eu não quero dividir a string e fazer a conversão (esse será meu último recurso). Além disso, é garantido que as seqüências estão em inglês.

MSDN: TextInfo.ToTitleCase

Certifique-se de include: 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 

Tente isto:

 string myText = "a Simple string"; string asTitleCase = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo. ToTitleCase(myText.ToLower()); 

Como já foi mencionado, o uso de TextInfo.ToTitleCase pode não fornecer os resultados exatos que você deseja. Se você precisar de mais controle sobre a saída, você poderia fazer algo assim:

 IEnumerable 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; } } 

E então use assim:

 var asTitleCase = new string( CharsToTitleCase(myText).ToArray() ); 

Ainda outra variação. Com base em várias dicas aqui, reduzi esse método de extensão, que funciona muito bem para os meus propósitos:

 public static string ToTitleCase(this string s) => CultureInfo.InvariantCulture.TextInfo.ToTitleCase(s.ToLower()); 

Pessoalmente eu tentei o método TextInfo.ToTitleCase , mas, eu não entendo porque não funciona quando todos os caracteres estão em maiúsculas.

Embora eu goste da function util fornecida por Winston Smith , deixe-me fornecer a function que estou usando atualmente:

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

Jogando com algumas seqüências de testes :

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

Dando saída :

 |Converting String To Title Case In C#| |C| || | | || 

Recentemente eu encontrei uma solução melhor.

Se o seu texto contiver todas as letras em maiúsculas, o TextInfo não o converterá no caso apropriado. Podemos consertar isso usando a function de letras minúsculas dentro dessa forma:

 public static string ConvertTo_ProperCase(string text) { TextInfo myTI = new CultureInfo("en-US", false).TextInfo; return myTI.ToTitleCase(text.ToLower()); } 

Agora isso irá converter tudo o que vem para o Propercase.

 public static string PropCase(string strText) { return new CultureInfo("en").TextInfo.ToTitleCase(strText.ToLower()); } 

Se alguém estiver interessado na solução do Compact Framework:

 return String.Join(" ", thestring.Split(' ').Select(i => i.Substring(0, 1).ToUpper() + i.Substring(1).ToLower()).ToArray()); 

Aqui está a solução para esse problema …

 CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture; TextInfo textInfo = cultureInfo.TextInfo; string txt = textInfo.ToTitleCase(txt); 

Use ToLower() primeiro, do que CultureInfo.CurrentCulture.TextInfo.ToTitleCase no resultado para obter a saída correta.

  //--------------------------------------------------------------- // Get title case of a string (every word with leading upper case, // the rest is lower case) // ie: 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()); } 

Eu precisava de uma maneira de lidar com todas as letras maiúsculas, e gostei da solução de Ricky AH, mas dei um passo além para implementá-la como um método de extensão. Isso evita o passo de ter que criar sua matriz de chars e então chamar ToArray explicitamente toda vez – então você pode simplesmente chamar isto na string, assim:

uso:

 string newString = oldString.ToProper(); 

código:

 public static class StringExtensions { public static string ToProper(this string s) { return new string(s.CharsToTitleCase().ToArray()); } public static IEnumerable 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; } } } 

É melhor entender tentando seu próprio código …

Consulte Mais informação

http://www.stupidcodes.com/2014/04/convert-string-to-uppercase-proper-case.html

1) Converter uma string em maiúscula

 string lower = "converted from lowercase"; Console.WriteLine(lower.ToUpper()); 

2) Converter uma string em minúscula

 string upper = "CONVERTED FROM UPPERCASE"; Console.WriteLine(upper.ToLower()); 

3) Converter uma string para TitleCase

  CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture; TextInfo textInfo = cultureInfo.TextInfo; string txt = textInfo.ToTitleCase(TextBox1.Text()); 

Aqui está uma implementação, personagem por personagem. Deve trabalhar com “(um dois três)”

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

Tente isto:

 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; } } 

Chame esse método no evento TextChanged do TextBox.

Eu usei as referências acima e a solução completa é: –

 Use Namespace System.Globalization; string str="INFOA2Z means all information"; 

// Precisa de um resultado como “Infoa2z significa todas as informações”
// Precisamos converter a string em minúsculas também, senão não está funcionando corretamente.

 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#

Isso é o que eu uso e funciona na maioria dos casos, a menos que o usuário decida substituí-lo pressionando shift ou caps lock. Como nos teclados Android e iOS.

 Private Class ProperCaseHandler Private Const wordbreak As String = " ,.1234567890;/\-()#$%^&*€!~+=@" 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 

Para aqueles que estão querendo fazer isso automaticamente, eu fiz com o seguinte código em vb.net em um controle de checkbox de texto personalizado – você pode obviamente também fazer isso com uma checkbox de texto normal – mas eu gosto da possibilidade de adicionar código recorrente para controles específicos através de controles personalizados, é adequado ao conceito de OOP.

 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  Public Property ProperCasing As Boolean Get Return _ProperCasing End Get Set(value As Boolean) _ProperCasing = value End Set End Property End Class 

Você pode alterar diretamente o texto ou a string para o apropriado usando este método simples, depois de verificar valores de string nulos ou vazios para eliminar erros:

 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; } 

Funciona bem, mesmo com o caso do camelo: ‘someText in YourPage’

 public static class StringExtensions { ///  /// Title case example: 'Some Text In Your Page'. ///  /// Support camel and title cases combinations: 'someText in YourPage' 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's 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(); } } 

Eu sei que esta é uma pergunta antiga, mas eu estava procurando a mesma coisa para C e eu percebi isso, então eu pensei em postá-la se alguém estivesse procurando um caminho em 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; }