visual validar una studio solo primera poner palabra minusculas mayusculas mayuscula letra convertir caracteres cadena cada c# string capitalization

validar - textbox solo mayusculas c#



Poner en mayúsculas las palabras en una cadena usando c# (10)

¿Por qué no usar ToTitleCase() primero y luego mantener una lista de palabras aplicables y Replace nuevamente a la versión en minúsculas de esas palabras aplicables (siempre que esa lista sea pequeña)?

La lista de palabras aplicables podría mantenerse en un diccionario y .ToLower() manera bastante eficiente, reemplazando con el equivalente a .ToLower() .

Necesito tomar una cuerda y escribir en mayúsculas las palabras. Ciertas palabras ("en", "en", etc.) no se escriben en mayúscula y se cambian a minúsculas si se encuentran. La primera palabra siempre debe estar en mayúsculas. Los apellidos como "McFly" no están en el alcance actual, por lo que la misma regla se aplicará a ellos, solo la primera letra en mayúscula.

Por ejemplo: "de ratones y hombres por CNN" debe cambiarse a "De ratones y hombres por CNN". ( Por lo tanto, ToTitleString no funcionará aquí )

Me pregunto cuál sería la mejor manera de hacerlo. Lo que pensé es dividir la cadena por espacios, revisar cada palabra, cambiarla si es necesario y concatenarla con la palabra anterior, y así sucesivamente. Parece bastante ingenuo y me preguntaba si hay una mejor manera de hacerlo usando .Net 3.5.


Aquí está la respuesta Cómo capitalizar nombres

CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture; TextInfo textInfo = cultureInfo.TextInfo; Console.WriteLine(textInfo.ToTitleCase(title)); Console.WriteLine(textInfo.ToLower(title)); Console.WriteLine(textInfo.ToUpper(title));


Debes crear tu propia función como estás describiendo.


Dependiendo de la frecuencia con la que planeas hacer el uso de mayúsculas, iría con el enfoque ingenuo. Posiblemente podría hacerlo con una expresión regular, pero el hecho de que no quiera ciertas palabras en mayúscula hace que sea un poco más complicado.

Editar:

Puedes hacerlo con dos pases utilizando expresiones regulares.

var result = Regex.Replace("of mice and men isn''t By CNN", @"/b(/w)", m => m.Value.ToUpper()); result = Regex.Replace(result, @"(/s(of|in|by|and)|/'[st])/b", m => m.Value.ToLower(), RegexOptions.IgnoreCase);

Esta salida Of Mice and Men Isn''t by CNN .

La primera expresión pone en mayúscula cada letra en el límite de una palabra y la segunda borra cualquier palabra que coincida con la lista que está rodeada por espacios en blanco.

Las desventajas de este enfoque es que está utilizando expresiones regulares (ahora tiene dos problemas) y tendrá que mantener actualizada la lista de palabras excluidas. Mi expresión regular no es lo suficientemente buena como para poder hacerlo en una expresión, pero podría ser posible.


Intenta algo como esto:

public static string TitleCase(string input, params string[] dontCapitalize) { var split = input.Split('' ''); for(int i = 0; i < split.Length; i++) split[i] = i == 0 ? CapitalizeWord(split[i]) : dontCapitalize.Contains(split[i]) ? split[i] : CapitalizeWord(split[i]); return string.Join(" ", split); } public static string CapitalizeWord(string word) { return char.ToUpper(word[0]) + word.Substring(1); }

Luego puede actualizar el método de CapitalizeWord si necesita manejar apellidos complejos. Agrega esos métodos a una clase y utilízalos así:

SomeClass.TitleCase("a test is a sentence", "is", "a"); // returns "A Test is a Sentence"


La solución obvia más fácil (para oraciones en inglés) sería:

  • "sentence".Split(" ") la oración en caracteres de espacio
  • Recorrer cada elemento
  • Escriba con mayúscula la primera letra de cada elemento - item[i][0].ToUpper() ,
  • Remerge de nuevo en una cadena unida en un espacio.
  • Repita este proceso con "." y "," usando esa nueva cadena.

Puede tener un Diccionario con las palabras que le gustaría ignorar, dividir la oración en frases (.split ('''')) y para cada frase, verificar si la frase existe en el diccionario, si no es así, poner en mayúscula el primer carácter y luego, agregue la cadena a un búfer de cadena. Si la frase que está procesando actualmente está en el diccionario, simplemente agréguela al búfer de cadena.


Un enfoque no inteligente que maneja el caso simple:

var s = "of mice and men By CNN"; var sa = s.Split('' ''); for (var i = 0; i < sa.Length; i++) sa[i] = sa[i].Substring(0, 1).ToUpper() + sa[i].Substring(1); var sout = string.Join(" ", sa); Console.WriteLine(sout);


Una leve mejora en la respuesta de jonnii:

var result = Regex.Replace(s.Trim(), @"/b(/w)", m => m.Value.ToUpper()); result = Regex.Replace(result, @"/s(of|in|by|and)/s", m => m.Value.ToLower(), RegexOptions.IgnoreCase); result = result.Replace("''S", "''s");


Utilizar

Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase("of mice and men By CNN");

para convertir al caso adecuado y luego puede recorrer las palabras clave como lo ha mencionado.