c# - validar - Convierta toda la primera letra a mayúscula, descanse más abajo para cada palabra
saber si una letra es mayuscula c# (8)
Además de la primera respuesta, recuerde cambiar el índice de inicio de selección de cadena al final de la palabra u obtendrá el orden inverso de las letras en la cadena.
s.SelectionStart=s.Length;
Tengo una cadena de texto (alrededor de 5-6 palabras en su mayoría) que necesito convertir.
Actualmente el texto se ve así:
THIS IS MY TEXT RIGHT NOW
Quiero convertirlo a:
This Is My Text Right Now
Puedo recorrer mi colección de cadenas, pero no estoy seguro de cómo realizar esta modificación de texto.
Cuando se construyen mesas grandes, la velocidad es una preocupación, por lo que la segunda función de Jamie Dixon es la mejor, pero no funciona del todo como es ...
No puede tomar todas las letras en minúscula, y solo escribe en mayúscula la primera letra de la cadena, no la primera letra de cada palabra en la cadena ... la siguiente opción corrige los dos problemas:
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);
}
Aunque en este punto, si esta sigue siendo la opción más rápida es incierta, la solución Regex
provista por George Mauer podría ser más rápida ... alguien que se preocupe lo suficiente debería probarla.
Hay un par de formas de convertir el primer carácter de una cuerda en mayúscula.
La primera forma es crear un método que simplemente bloquee el primer carácter y anexe el resto de la cadena usando una subcadena:
public string UppercaseFirst(string s)
{
return char.ToUpper(s[0]) + s.Substring(1);
}
La segunda forma (que es un poco más rápida) es dividir la cadena en una matriz char y luego volver a construir la cadena:
public string UppercaseFirst(string s)
{
char[] a = s.ToCharArray();
a[0] = char.ToUpper(a[0]);
return new string(a);
}
No probado pero algo así debería funcionar:
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()));
Esencialmente dice "preformar una coincidencia de expresiones regulares en todas las apariciones de un carácter alfanumérico que sigue a otro carácter alfanumérico y luego reemplazarlo con una versión en minúsculas de sí mismo"
No sé si la solución a continuación es más o menos eficiente que la respuesta de jspcal, pero estoy bastante seguro de que requiere menos creación de objetos que la de Jamie y George.
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();
Probablemente prefiera invocar ToTitleCase desde CultureInfo ( System.Globalization ) que Thread.CurrentThread ( System.Threading )
string s = "THIS IS MY TEXT RIGHT NOW";
s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());
pero debería ser lo mismo que la solución jspcal
EDITAR
En realidad, esas soluciones no son las mismas : 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
Referencias
Si está usando una página web, también puede usar CSS:
style="text-transform:capitalize;"
string s = "THIS IS MY TEXT RIGHT NOW";
s = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());