¿Hay alguna manera fácil de poner en mayúscula la primera letra de una cadena y bajar el resto? ¿Existe un método incorporado o necesito hacer el mío?
c#
string
capitalize
Mike Roosa
fuente
fuente
Respuestas:
TextInfo.ToTitleCase()
capitaliza el primer carácter en cada ficha de una cadena.Si no es necesario mantener las siglas en mayúsculas, entonces debe incluir
ToLower()
.Si CurrentCulture no está disponible, use:
Consulte el enlace de MSDN para obtener una descripción detallada.
fuente
fuente
sItem = Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(sItem.ToLower) 'first char upper case
CurrentCulture
, ¿cómo podemos estar seguros de que no hay una cultura que maneje esto de manera diferente?El código anterior no funcionará .....
así que pon el siguiente código convirtiendo a inferior y luego aplica la función
fuente
Hay algunos casos que
CultureInfo.CurrentCulture.TextInfo.ToTitleCase
no pueden manejar, por ejemplo: el apóstrofe'
.Una expresión regular también se puede usar
\b[a-zA-Z]
para identificar el carácter inicial de una palabra después del límite de una palabra\b
, entonces solo necesitamos reemplazar la coincidencia por su equivalencia en mayúsculas gracias alRegex.Replace(string input,string pattern,MatchEvaluator evaluator)
método:La expresión regular se puede ajustar si es necesario, por ejemplo, si queremos manejar los casos
MacDonald
yMcFry
la expresión regular se convierte en:(?<=\b(?:mc|mac)?)[a-zA-Z]
Si tenemos que manejar más prefijos sólo tenemos que modificar el grupo
(?:mc|mac)
, por ejemplo, para añadir prefijos francésdu, de
:(?:mc|mac|du|de)
.Finalmente, podemos darnos cuenta de que esta expresión regular también coincidirá con el caso
MacDonald'S
para el último,'s
por lo que debemos manejarla en la expresión regular con una mirada negativa hacia atrás(?<!'s\b)
. Al final tenemos:fuente
\b[ivxlcdm]+$|
así es\b[ivxlcdm]+$|(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)
. Hará mayúsculas todas las palabras finales de un nombre que tenga un formato de número romano no estricto (ivxlcdm
). Sin embargo, puede tener algunos resultados no deseados, por ejemplo, 'Li' se convertirá en 'LI'Regex.Replace("JOHN DOE".ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)", m => m.Value.ToUpper())
Mc y Mac son prefijos de apellidos comunes en todo EE. UU., Y hay otros. TextInfo.ToTitleCase no maneja esos casos y no debe usarse para este propósito. Así es como lo estoy haciendo:
fuente
ToTitleCase () debería funcionar para usted.
http://support.microsoft.com/kb/312890
fuente
La opción más directa será utilizar la función ToTitleCase que está disponible en .NET, que debería ocuparse del nombre la mayor parte del tiempo. Como señaló Edg , hay algunos nombres para los que no funcionará, pero estos son bastante raros, por lo que, a menos que se dirija a una cultura donde tales nombres son comunes, no es necesario algo de lo que deba preocuparse demasiado.
Sin embargo, si no está trabajando con un lenguaje .NET, entonces depende de cómo se vea la entrada; si tiene dos campos separados para el nombre y el apellido, entonces puede poner en mayúscula la primera letra más abajo usando el resto. subcadenas.
Sin embargo, si se le proporcionan varios nombres como parte de la misma cadena, entonces necesita saber cómo está obteniendo la información y dividirla en consecuencia. Entonces, si obtiene un nombre como "John Doe", puede dividir la cadena en función del carácter de espacio. Si está en un formato como "Doe, John", deberá dividirlo según la coma. Sin embargo, una vez que lo haya dividido, simplemente aplique el código que se mostró anteriormente.
fuente
CultureInfo.CurrentCulture.TextInfo.ToTitleCase ("mi nombre");
devuelve ~ Mi nombre
Pero el problema aún existe con nombres como McFly como se indicó anteriormente.
fuente
Yo uso mi propio método para arreglar esto:
Por ejemplo, la frase: "hola mundo. Hola, este es el mundo de stackoverflow". será "Hola mundo. Hola, este es el mundo de Stackoverflow". Regex \ b (comienzo de una palabra) \ w (primer personaje de la palabra) hará el truco.
fuente
Las sugerencias para usar ToTitleCase no funcionarán para cadenas que están en mayúsculas. Entonces tendrás que llamar a ToUpper en el primer personaje y a ToLower en los personajes restantes.
fuente
Esta clase hace el truco. Puede agregar nuevos prefijos a la matriz de cadenas estáticas _prefixes .
fuente
Si usa vS2k8, puede usar un método de extensión para agregarlo a la clase String:
fuente
Char.ToUpper(input[0]) + input.Substring(1)
es más legible en mi humilde opinión.input.FirstLetterToUpper()
es ciertamente más legible frenteChar.ToUpper(input[0]) + input.Substring(1)
, pero menos transparentePara resolver algunos de los problemas / problemas que se han destacado, sugeriría convertir primero la cadena a minúscula y luego llamar al método ToTitleCase. Luego puede usar IndexOf ("Mc") o IndexOf ("O \ '") para determinar casos especiales que requieren atención más específica.
fuente
Me gusta de esta manera:
Retirado de este artículo de MSDN .
fuente
Espero que esto te ayude.
fuente
fuente
Como se indica en edg, necesitará un algoritmo más complejo para manejar nombres especiales (esta es probablemente la razón por la cual muchos lugares fuerzan todo a mayúsculas).
Algo como esto no probado c # debería manejar el caso simple que solicitó:
fuente