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.
Me gusta decir Lorem Lipsum por alguna razón ^^ – marcgg
¡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
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. –