Convertir cadena a mayúsculas y minúsculas

Resuelto Naveen asked hace 15 años • 24 respuestas

Tengo una cadena que contiene palabras en una combinación de caracteres en mayúsculas y minúsculas.

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

Necesito convertir el primer carácter de cada palabra (separado por espacios) a mayúsculas. Entonces quiero el resultado como:string myData ="A Simple String";

¿Hay alguna manera fácil de hacer esto? No quiero dividir la cadena y realizar la conversión (ese será mi último recurso). Además, se garantiza que las cadenas estén en inglés.

Naveen avatar Jul 30 '09 18:07 Naveen
Aceptado

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
Kobi avatar Jul 30 '2009 11:07 Kobi

Prueba esto:

string myText = "a Simple string";

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

Como ya se ha señalado, es posible que el uso de TextInfo.ToTitleCase no le brinde los resultados exactos que desea. Si necesita más control sobre la salida, puede 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 úsalo así:

var asTitleCase = new string( CharsToTitleCase(myText).ToArray() );
Winston Smith avatar Jul 30 '2009 11:07 Winston Smith

Otra variación más. Basándome en varios consejos aquí, 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());
Todd Menier avatar Jun 05 '2014 19:06 Todd Menier

Personalmente probé el TextInfo.ToTitleCasemétodo, pero no entiendo por qué no funciona cuando todos los caracteres están en mayúsculas.

Aunque me gusta la función util proporcionada por Winston Smith , permítanme proporcionarles 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 prueba :

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|
||
|   |
||
Luis Quijada avatar Feb 17 '2012 12:02 Luis Quijada