2009-12-21 6 views

Respuesta

208
string s = "THIS IS MY TEXT RIGHT NOW"; 

s = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(s.ToLower()); 
+2

wow, yo no habría adivinado que haber existido una! – mrblah

+0

¡Impresionante! Nunca lo supe de eso – GrayWizardx

+20

Jaja, ¿en serio? Ahí es donde está? Me encanta .NET pero algunos de los diseñadores de API son verdaderos idiotas. –

14

Hay un par de maneras de hacer la conversión del primer carácter de una cuerda a mayúscula.

La primera forma es crear un método que simplemente limita el primer carácter y añade el resto de la cadena usando una subcadena:

public string UppercaseFirst(string s) 
    { 
     return char.ToUpper(s[0]) + s.Substring(1); 
    } 

La segunda manera (que es ligeramente más rápido) es dividir la cadena de en una matriz de caracteres y volver a crear la cadena:

public string UppercaseFirst(string s) 
    { 
     char[] a = s.ToCharArray(); 
     a[0] = char.ToUpper(a[0]); 
     return new string(a); 
    } 
+1

Esta solución no responde exactamente la pregunta de forma adecuada. El título de la pregunta es "Convertir todas las primeras letras a mayúsculas, descansar más abajo para cada palabra". Sin embargo, esta solución solo capitaliza la primera letra de la cadena completa. Por lo tanto, esta solución convertiría "hello world" en "Hello world", en lugar de "Hello World". – brsfan

2

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 la creación de objetos de Jamie y George's

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(); 
+1

Si nos preocupa la creación de objetos, ¿por qué no hacerlo en el lugar con un bucle for indexando sobre s en lugar de usar un StringBuilder? – jball

+3

Las cadenas son inmutables. – ephemient

8

no probado, pero algo como esto 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 "preformas un partido de expresiones regulares en todas las apariciones de un carácter alfanumérico que sigue a otro carácter alfanumérico y luego sustituirla por una versión en minúsculas de sí mismo"

+0

Esto es exactamente lo que he estado buscando, ¡gracias! –

68

probablemente prefiero invocar la ToTitleCase de CultureInfo (S ystem.Globalization) que Thread.currentThread (System.Threading)

string s = "THIS IS MY TEXT RIGHT NOW"; 
s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower()); 

pero debe ser la misma que la solución jspcal

EDITAR

En realidad esas soluciones son no es lo mismo: 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:

6

Cuando la construcción de gran velocidad de cuadros es una preocupación tan segunda función de Jamie Dixon es mejor, pero DOESN No funciona completamente como está ...

efecto, no tiene todas las letras en minúsculas, y sólo en mayúscula la primera letra de la cadena, no es la primera letra de cada palabra de la cadena ... la opción de abajo fija dos cuestiones:

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 momento, si esta sigue siendo la opción más rápida es incierta, la solución Regex proporcionada por George Mauer podría ser más rápida ... alguien que se preocupe lo suficiente debería probarla.

+2

funciona, pero cambié este "a.Count()" a a.Length – Christian

8

Si está utilizando en una página web, también se puede utilizar CSS:

style="text-transform:capitalize;"

+1

¿Por qué CSS? Cuando la pregunta es para ** C# asp.net regex ** – Jay

Cuestiones relacionadas