c# - truncar - Convertir la cadena en el caso del título
substring c# (20)
Tengo una cadena que contiene palabras en una mezcla de mayúsculas y minúsculas.
Por ejemplo: string myData = "a Simple string";
Necesito convertir el primer carácter de cada palabra (separados por espacios) en mayúsculas. Así que quiero el resultado como: string myData ="A Simple String";
¿Hay alguna manera fácil de hacer esto? No quiero dividir la cadena y hacer la conversión (ese será mi último recurso). Además, está garantizado que las cadenas están en inglés.
Aquí está la solución para ese problema ...
CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
TextInfo textInfo = cultureInfo.TextInfo;
string txt = textInfo.ToTitleCase(txt);
Aquí hay una implementación, personaje por personaje. Debería trabajar con "(One Two Three)"
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);
}
Es mejor entenderlo probando tu propio código ...
Lee mas
http://www.stupidcodes.com/2014/04/convert-string-to-uppercase-proper-case.html
1) Convertir una cadena a mayúsculas
string lower = "converted from lowercase";
Console.WriteLine(lower.ToUpper());
2) Convertir una cadena a minúsculas
string upper = "CONVERTED FROM UPPERCASE";
Console.WriteLine(upper.ToLower());
3) Convertir una cadena a TitleCase
CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
TextInfo textInfo = cultureInfo.TextInfo;
string txt = textInfo.ToTitleCase(TextBox1.Text());
Esto es lo que uso y funciona en la mayoría de los casos, a menos que el usuario decida anularlo presionando Mayús o Bloq mayús. Al igual que en los teclados Android y 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
MSDN: TextInfo.ToTitleCase
Asegúrese de incluir: 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
Necesitaba una forma de lidiar con las palabras en mayúsculas, y me gustó la solución de Ricky AH, pero fui un paso más para implementarla como un método de extensión. Esto evita el paso de tener que crear su matriz de caracteres y luego llamar a ToArray en él explícitamente cada vez, por lo que puede llamarlo a la cadena, así:
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<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;
}
}
}
Otra variación más. Basándome en varios consejos, lo he reducido a este método de extensión, que funciona muy bien para mis propósitos:
public static string ToTitleCase(this string s) =>
CultureInfo.InvariantCulture.TextInfo.ToTitleCase(s.ToLower());
Para aquellos que buscan hacerlo automáticamente al presionar teclas, lo hice con el siguiente código en vb.net en un control de cuadro de texto personalizado; obviamente, también puede hacerlo con un cuadro de texto normal, pero me gusta la posibilidad de agregar código recurrente para controles específicos A través de controles personalizados se adapta al concepto 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
<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
Personalmente probé el método TextInfo.ToTitleCase
, pero no entiendo por qué no funciona cuando todos los caracteres están en mayúsculas.
Aunque me gusta la función util provista por Winston Smith , permítame proporcionar la función que estoy usando actualmente:
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);
}
Jugando con algunas cadenas de pruebas :
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 salida :
|Converting String To Title Case In C#|
|C|
||
| |
||
Prueba esto:
string myText = "a Simple string";
string asTitleCase =
System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.
ToTitleCase(myText.ToLower());
Como ya se ha señalado, el uso de TextInfo.ToTitleCase puede no darle los resultados exactos que desea. Si necesita más control sobre la salida, podría hacer algo como esto:
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;
}
}
Y luego usarlo así:
var asTitleCase = new string( CharsToTitleCase(myText).ToArray() );
Prueba esto:
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;
}
}
Llame a este método en el evento TextChanged del TextBox.
Puede cambiar directamente el texto o la cadena a este método simple, después de verificar los valores de cadena nula o vacía para eliminar errores:
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;
}
Recientemente he encontrado una mejor solución.
Si su texto contiene todas las letras en mayúsculas, TextInfo no lo convertirá en el caso adecuado. Podemos arreglar eso usando la función de minúsculas dentro de esta manera:
public static string ConvertTo_ProperCase(string text)
{
TextInfo myTI = new CultureInfo("en-US", false).TextInfo;
return myTI.ToTitleCase(text.ToLower());
}
Ahora esto convertirá todo lo que viene en Propercase.
Sé que esta es una vieja pregunta, pero estaba buscando lo mismo para C y lo descubrí, así que pensé que lo publicaría si alguien más estuviera buscando una forma en 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;
}
Si alguien está interesado en la solución para Compact Framework:
return String.Join(" ", thestring.Split('' '').Select(i => i.Substring(0, 1).ToUpper() + i.Substring(1).ToLower()).ToArray());
Use ToLower()
primero, que CultureInfo.CurrentCulture.TextInfo.ToTitleCase
en el resultado para obtener el resultado correcto.
//---------------------------------------------------------------
// 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());
}
Utilicé las referencias anteriores y la solución completa es: -
Use Namespace System.Globalization;
string str="INFOA2Z means all information";
// Necesito un resultado como "Infoa2z significa toda la información"
// Necesitamos convertir la cadena en minúsculas también, de lo contrario no está funcionando correctamente.
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#
Funciona bien incluso con el caso de camello: ''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''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();
}
}
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);
}
public static string PropCase(string strText)
{
return new CultureInfo("en").TextInfo.ToTitleCase(strText.ToLower());
}