2009-05-26 8 views
48

Podría escribir mi propio algoritmo para hacerlo, pero creo que debería haber el equivalente a ruby's humanize en C#.¿Cómo se escribe con mayúscula el primer carácter de cada palabra, o el primer carácter de una cadena completa, con C#?

Lo busqué en Google pero solo encontré formas de humanizar las fechas.

Ejemplos:

  • una manera de convertir "Lorem Lipsum Et" en "Lorem lipsum et"
  • una manera de convertir "Lorem lipsum et" en "Lorem Lipsum Et"
+1

Me gusta decir Lorem Lipsum por alguna razón ^^ – marcgg

+3

¡Siempre hay expresiones regulares! cadena strToCap = strSource.ToLower(); Regex rCapitalize = new Regex ("(? <= [! \.?] \ S +) [A-Za-z]"); strToCap = rCapitalize.Replace (strToCap, m => {return m.Value.ToUpper();}); ... pero entonces tendrías DOS problemas.:) – rijipooh

+3

Como la respuesta aceptada está vinculada a un código que hace lo contrario de lo que la pregunta original pedía, he editado la pregunta para pedir ambas direcciones, con la esperanza de que esta pregunta no sea totalmente confusa para los futuros usuarios que tropezar con eso. –

Respuesta

90

Como se discutió en los comentarios de @miguel's answer, puede usar TextInfo.ToTitleCase que ha estado disponible desde .NET 1.1. Aquí hay un código que corresponde a tu ejemplo:

string lipsum1 = "Lorem lipsum et"; 

// Creates a TextInfo based on the "en-US" culture. 
TextInfo textInfo = new CultureInfo("en-US",false).TextInfo; 

// Changes a string to titlecase. 
Console.WriteLine("\"{0}\" to titlecase: {1}", 
        lipsum1, 
        textInfo.ToTitleCase(lipsum1)); 

// Will output: "Lorem lipsum et" to titlecase: Lorem Lipsum Et 

Se ignoran las cosas de la carcasa que son todas las tapas como "LOREM Lipsum ET", ya que se ocupa de los casos, si las siglas están en el texto (por lo que "NAMBLA" no se convertirá en "nambla" o "Nambla").

Sin embargo, si sólo desea mayúsculas el primer carácter que puede hacer la solución que está sobre here ... o usted podría dividir la cadena y capitalizar el primero en la lista:

string lipsum2 = "Lorem Lipsum Et"; 

string lipsum2lower = textInfo.ToLower(lipsum1); 

string[] lipsum2split = lipsum2lower.Split(' '); 

bool first = true; 

foreach (string s in lipsum2split) 
{ 
    if (first) 
    { 
     Console.Write("{0} ", textInfo.ToTitleCase(s)); 
     first = false; 
    } 
    else 
    { 
     Console.Write("{0} ", s); 
    } 
} 

// Will output: Lorem lipsum et 
+0

¿cómo más gente no sabe sobre esto. Este es el método construido brillante, gracias – Coops

+2

Haha 3 años después y NAMBLA todavía me hace reír, oh y +1 para ToTitleCase() –

+1

Problema encontrado con ToTitleCase Primero se convertirá en 1St. –

2

Si lo que desea es mayúsculas el primer carácter, sólo se adhieren esto en un método de utilidad de su propia:

return string.IsNullOrEmpty(str) 
    ? str 
    : str[0].ToUpperInvariant() + str.Substring(1).ToLowerInvariant(); 

Hay también un método de biblioteca a mayúsculas el primer carácter de cada palabra:

http://msdn.microsoft.com/en-us/library/system.globalization.textinfo.totitlecase.aspx

+0

Eso solo le dará título de caso: "Lorem Ipsum Et", no caso de oraciones: "Lorem ipsum et", ¿verdad? – vinny

+0

Creo que hace lo contrario. –

+0

Estaba pensando esto, pero ToTitleCase es lo opuesto a lo que desea OP. –

0

no existe una solución pre-compilados para captialization lingüística adecuada en .NET. ¿Para qué tipo de capitialización vas? ¿Estás siguiendo las convenciones del Manual de Estilo de Chicago? AMA o MLA? Incluso la capitalización simple de oraciones en inglés tiene 1000 excepciones especiales para las palabras. No puedo hablar de lo que hace el rubí humanizar, pero me imagino que probablemente no siga las reglas lingüísticas de la capitalización y, en cambio, haga algo mucho más simple.

Internamente, nos encontramos con este mismo problema y tuvimos que escribir un código de cantidad bastante grande solo para manejar la carcasa adecuada (en nuestro pequeño mundo) de títulos de artículos, sin siquiera tener en cuenta la capitalización de oraciones. Y de hecho se vuelve "borroso" :)

Realmente depende de lo que necesita, ¿por qué está tratando de convertir las oraciones a mayúsculas adecuadas (y en qué contexto)?

0

técnica de CSS es vale, pero solo cambia la presentación de la cadena en el navegador. Un mejor método es hacer que el texto se capitalice antes de enviarlo al navegador.

La mayoría de los implimentations anteriores están bien, pero ninguno de ellos aborda la cuestión de lo que sucede si se han mezclado las palabras de casos que necesitan ser preservados, o si desea utilizar cierto tipo título, por ejemplo:

"dónde estudiar cursos de doctorado en los EE.UU."

o

"IRS Form UB40a"

también usando CultureInfo.CurrentCulture.TextInfo.ToTitleCase (cadena) preserva las palabras en mayúscula como en "deportes y béisbol MLB" que se convierte en "Deportes y béisbol MLB", pero si toda la cadena se pone en mayúsculas, entonces esto causa un problema.

Así que reúno una función simple que le permite mantener las palabras mayúsculas y minúsculas y hacer minúsculas en minúsculas (si no están al principio y al final de la frase) incluyéndolas en un Cajas y mayúsculas especiales matrices de cadenas:

public static string TitleCase(string value) { 
     string titleString = ""; // destination string, this will be returned by function 
     if (!String.IsNullOrEmpty(value)) { 
      string[] lowerCases = new string[12] { "of", "the", "in", "a", "an", "to", "and", "at", "from", "by", "on", "or"}; // list of lower case words that should only be capitalised at start and end of title 
      string[] specialCases = new string[7] { "UK", "USA", "IRS", "UCLA", "PHd", "UB40a", "MSc" }; // list of words that need capitalisation preserved at any point in title 
      string[] words = value.ToLower().Split(' '); 
      bool wordAdded = false; // flag to confirm whether this word appears in special case list 
      int counter = 1; 
      foreach (string s in words) { 

       // check if word appears in lower case list 
       foreach (string lcWord in lowerCases) { 
        if (s.ToLower() == lcWord) { 
         // if lower case word is the first or last word of the title then it still needs capital so skip this bit. 
         if (counter == 0 || counter == words.Length) { break; }; 
         titleString += lcWord; 
         wordAdded = true; 
         break; 
        } 
       } 

       // check if word appears in special case list 
       foreach (string scWord in specialCases) { 
        if (s.ToUpper() == scWord.ToUpper()) { 
         titleString += scWord; 
         wordAdded = true; 
         break; 
        } 
       } 

       if (!wordAdded) { // word does not appear in special cases or lower cases, so capitalise first letter and add to destination string 
        titleString += char.ToUpper(s[0]) + s.Substring(1).ToLower(); 
       } 
       wordAdded = false; 

       if (counter < words.Length) { 
        titleString += " "; //dont forget to add spaces back in again! 
       } 
       counter++; 
      } 
     } 
     return titleString; 
    } 

esto es sólo un método rápido y sencillo - y, probablemente, se puede mejorar un poco si quieres pasar más tiempo en él.

si desea mantener el uso de mayúsculas de las palabras más pequeñas como "a" y "de", simplemente elimínelas de la matriz de cadenas de casos especiales. Las diferentes organizaciones tienen diferentes reglas sobre capitalización.

Puede ver un ejemplo de este código en acción en este sitio: Egg Donation London - este sitio crea automáticamente rutas de exploración en la parte superior de las páginas mediante el análisis de la URL, por ejemplo, "/ services/uk-egg-bank/introduction" - luego, cada nombre de carpeta en el camino tiene guiones reemplazados por espacios y escribe en mayúscula el nombre de la carpeta, por lo que uk-egg-bank se convierte en UK Egg Bank. (preservando la mayúscula 'UK')

Una extensión de este código podría ser tener una tabla de búsqueda de acrónimos y mayúsculas/minúsculas en un archivo de texto compartido, tabla de base de datos o servicio web para que la lista de casos combinados las palabras se pueden mantener desde un solo lugar y se pueden aplicar a muchas aplicaciones diferentes que dependen de la función.

19

utilizar expresiones regulares para esto parece mucho más limpio:

string s = "the quick brown fox jumps over the lazy dog"; 
s = Regex.Replace(s, @"(^\w)|(\s\w)", m => m.Value.ToUpper()); 
+0

Expandiendo la respuesta: string s = "EL BREVE FONDO JUEGA SOBRE EL LAGADO LAG"; s = Regex.Replace (s.ToLower(), @ "(^ \ w) | (\ s \ w)", m => m.Value.ToUpper()); – mcandal

2

Hay otra solución elegante:

Definir la función ToTitleCase en un estática clase de su Projet

using System.Globalization; 

public static string ToTitleCase(this string title) 
{ 
    return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(title); 
} 

Y luego úselo como una extensión de cadena en cualquier lugar de su proyecto:

"have a good day !".ToTitleCase() // "Have A Good Day !" 
Cuestiones relacionadas