Tengo un DetailsView
con TextBox
ay quiero que los datos de entrada se guarden siempre con la PRIMERA CARTA EN CAPITAL.
Ejemplo:
"red" --> "Red"
"red house" --> " Red house"
¿Cómo puedo lograr este rendimiento maximizador ?
NOTA :
Según las respuestas y los comentarios que figuran debajo de las respuestas, muchas personas piensan que se trata de poner en mayúscula todas las palabras de la cadena. Por ejemplo => Red House
, no lo es, pero si eso es lo que busca , busque una de las respuestas que utiliza TextInfo
el ToTitleCase
método. (NOTA: Esas respuestas son incorrectas para la pregunta realmente formulada).
Consulte el documento TextInfo.ToTitleCase para ver las advertencias (no toca las palabras en mayúsculas; se consideran siglas; pueden aparecer letras minúsculas en el medio de las palabras que "no deberían" ser reducido, por ejemplo, "McDonald" => "Mcdonald"; no se garantiza que maneje todas las sutilezas específicas de la cultura con respecto a las reglas de capitalización).
NOTA :
La pregunta es ambigua en cuanto a si las letras después de la primera deben ser forzadas a minúsculas . La respuesta aceptada supone que solo la primera letra debe ser alterada . Si desea forzar todas las letras en la cadena, excepto las primeras en minúsculas, busque una respuesta que contenga ToLower
y no contenga ToTitleCase .
fuente
Respuestas:
Actualizado a C # 8
C # 7
Respuestas muy viejas
EDITAR : Esta versión es más corta. Para una solución más rápida, eche un vistazo a la respuesta de Equiso
EDIT 2 : Probablemente la solución más rápida es la de Darren (incluso hay un punto de referencia), aunque cambiaría su
string.IsNullOrEmpty(s)
validación para lanzar una excepción, ya que el requisito original espera que exista una primera letra para que pueda ser mayúscula. Tenga en cuenta que este código funciona para una cadena genérica y no particularmente en valores válidos deTextbox
.fuente
String.Join
es un separador con el cual unir cadenas dadas con el segundo parámetro.var arr = input.ToCharArray(); arr[0] = Char.ToUpperInvariant(arr[0]); return new String(arr);
probablemente ganaría algo de velocidad ya que está creando objetos menos inmutables (y especialmente se está saltando elString.Join
). Esto, por supuesto, depende de la longitud de la cadena."Argh!"
a cumplir con la regla de la primera letra mayúscula. ;)Respuesta anterior: Esto hace que cada primera letra en mayúscula
fuente
La forma correcta es usar Cultura:
Nota: Esto capitalizará cada palabra dentro de una cadena, por ejemplo, "casa roja" -> "Casa roja". La solución también incluirá mayúsculas en minúsculas en palabras, por ejemplo, "Old McDonald" -> "Old Mcdonald".
fuente
ToLower
es un error, ya que borra las mayúsculas en la mitad de la palabra, por ejemplo, "McDonalds". 3) La pregunta es sobre cambiar solo la primera palabra de la cadena , no sobre TitleCase.Tomé el método más rápido de http://www.dotnetperls.com/uppercase-first-letter y lo convertí al método de extensión:
NOTA: La razón por la que el uso
ToCharArray
es más rápido que la alternativachar.ToUpper(s[0]) + s.Substring(1)
es que solo se asigna una cadena, mientras que elSubstring
enfoque asigna una cadena para la subcadena, luego una segunda cadena para componer el resultado final.EDITAR : así es como se ve este enfoque, combinado con la prueba inicial de CarlosMuñoz acepta la respuesta :
fuente
return string.Empty
aquí escondería una llamada "mala" al método.Puede usar el "método ToTitleCase"
Este método de extensión resuelve todos los problemas de título.
fácil de usar
el método de extensión
fuente
FirstLetterToUpper
en la respuesta de Equiso (o en la respuesta más reciente de Guillernet), yToTitleCase
aquí, pero sin el segundo parámetro. Entonces no es necesarioenum TitleCase
.Para la primera letra, con comprobación de errores:
Y esto es lo mismo que una práctica extensión
fuente
fuente
Si el rendimiento / uso de la memoria es un problema, entonces este solo crea un (1) StringBuilder y una (1) nueva cadena del mismo tamaño que la cadena original.
fuente
char[]
lugar de tener toda la infraestructura de unaStringBuilder
envoltura. En lugar denew StringBuilder(str)
usarstr.ToCharArray()
y en lugar desb.ToString()
usarnew string(charArray)
.StringBuilder
emula el tipo de indexación que una matriz de caracteres expone de forma nativa, por lo que la.ToUpper
línea real puede ser esencialmente la misma. :-)ToCharArray
, como lo sugiere @JonathanGilbertMétodo más rápido.
Las pruebas muestran los siguientes resultados (cadena con símbolos 10000000 como entrada): resultados de la prueba
fuente
s
parámetro cuando sea nulo o vacío.Prueba esto:
fuente
Si solo le importa que la primera letra esté en mayúscula y no importa el resto de la cadena, puede seleccionar el primer carácter, ponerlo en mayúscula y concatenarlo con el resto de la cadena sin el primer carácter original.
Necesitamos convertir el primer carácter ToString () porque lo estamos leyendo como una matriz Char y el tipo Char no tiene el método ToUpper ().
fuente
Aquí hay una manera de hacerlo como un método de extensión:
Entonces se puede llamar así:
Y aquí hay algunas pruebas unitarias para ello:
fuente
string.Format
es exagerado; simplemente hazlotext.Substring(0, 1).ToUpper() + text.Substring(1)
.Ya que estaba trabajando en esto también y estaba buscando ideas, esta es la solución a la que llegué. Utiliza LINQ y podrá poner en mayúscula la primera letra de una cadena, incluso si la primera aparición no es una letra. Aquí está el método de extensión que terminé haciendo.
Estoy seguro de que hay una manera de optimizar o limpiar esto un poco.
fuente
Encontré algo aquí http://www.dotnetperls.com/uppercase-first-letter :
tal vez esto ayude !!
fuente
Compruebe si la cadena no es nula y luego convierta el primer carácter a mayúsculas y el resto a minúsculas:
fuente
Esto lo hará aunque también se asegurará de que no haya mayúsculas errantes que no estén al principio de la palabra.
fuente
s
antes de la llamada a ToTitleCase.Parece que hay mucha complejidad aquí cuando todo lo que necesitas es:
Puntos dignos de mención:
Es un método de extensión.
Si la entrada es nula, vacía o en blanco, la entrada se devuelve tal cual.
String.IsNullOrWhiteSpace se introdujo con .NET Framework 4. Esto no funcionará con marcos más antiguos.
fuente
IsNullOrWhiteSpace
más nuevo en lugar deIsNullOrEmpty
, es si vas a encontrar y cambiar el primer de espacio en blanco . Pero no lo haces, siempre operass[0]
. Por lo tanto, no tiene sentido [semánticamente y rendimiento] para usarIsNullOrWhiteSpace
.IsNullOrWhiteSpace
me preocupa, es que un lector descuidado podría pensar "Verificó el espacio en blanco, por lo que el siguiente código realmente encuentra y cambia una letra, incluso si está precedida por un espacio en blanco". Dado que su código no podrá cambiar una "primera" letra precedida por un espacio en blanco, el usoIsNullOrWhiteSpace
solo puede engañar a un lector.fuente
String
es puede ser cualquier cosa de suUpper
oLower
.so es una solución genérica para todos cadena.Join
lugar deemp.First().ToString().ToUpper() + emp.Substring(1);
? Es probable que tenga que ser más defensiva también:output = string.IsNullOrEmpty(emp) ? string.Empty : [...]
. Además, de acuerdo, @ CarlosMuñoz: no necesitas elToLower()
para la pregunta del OP.Substring
también es un buen estilo de escritura de código, acepto su solución para recortar un código, pero en este caso escribir unaToLower()
es una buena práctica de programación.string
puede ser cualquier cosa EnUpper
caso oLower
caso depende de la entrada del usuario, doy una solución genérica.Quería proporcionar una respuesta de "RENDIMIENTO MÁXIMO". En mi opinión, una respuesta de "RENDIMIENTO MÁXIMO" capta todos los escenarios y proporciona la respuesta a la pregunta que explica esos escenarios. Entonces, aquí está mi respuesta. Con estos motivos:
Proporcionarlos como parámetros opcionales hace que este método sea totalmente reutilizable, sin tener que escribir la cultura elegida cada vez.
fuente
Recientemente tuve un requisito similar y recordé que la función LINQ Select () proporciona un índice:
Como necesito eso muy a menudo, hice un método de extensión para el tipo de cadena:
Tenga en cuenta que solo la primera letra se convierte a mayúscula; no se tocan todos los caracteres restantes. Si necesita que los otros caracteres estén en minúsculas, también puede llamar a Char.ToLower (currentChar) para index> 0 o llamar a ToLower () en toda la cadena en primer lugar.
En cuanto al rendimiento, comparé el código con la solución de Darren. En mi máquina, el código de Darren es aproximadamente 2 veces más rápido, lo cual no es sorprendente, ya que está editando directamente solo la primera letra dentro de una matriz de caracteres. Así que le sugiero que tome el código de Darren si necesita la solución más rápida disponible. Si desea integrar también otras manipulaciones de cadenas, puede ser conveniente tener el poder expresivo de una función lambda tocando los caracteres de la cadena de entrada, puede extender fácilmente esta función, así que dejo esta solución aquí.
fuente
Creo que el siguiente método es la mejor solución.
árbitro
fuente
Como esta pregunta se trata de maximizar el rendimiento , adopté la versión de Darren para usar
Span
s, que reduce la basura y mejora la velocidad en aproximadamente un 10%.Actuación
Código de prueba completo
Editar: Hubo un typeo, en lugar de s [0], fue un [0] - esto da como resultado el encapsulado del mismo valor vacío al Span asignado a.
fuente
Esto pone en mayúscula esta primera letra y cada letra después de un espacio y en minúsculas cualquier otra letra.
fuente
Utiliza el siguiente código:
fuente
Parece que ninguna de las soluciones dadas aquí tratará con un espacio en blanco antes de la cadena.
Solo agrego esto como un pensamiento:
Debe manejar
this won't work on other answers
(esa oración tiene un espacio al principio), y si no le gusta el recorte de espacio, simplemente pase unfalse
segundo parámetro (o cambie el valor predeterminado afalse
, y pasetrue
si desea tratar con espacio)fuente
FluentSharp tiene el
lowerCaseFirstLetter
método que hace estohttps://github.com/o2platform/FluentSharp/blob/700dc35759db8e2164771a71f73a801aa9379074/FluentSharp.CoreLib/ExtensionMethods/System/String_ExtensionMethods.cs#L575
fuente
La forma más fácil de capitalizar la primera letra es:
1- Usando Sytem.Globalization;
``
fuente
La siguiente función es correcta en todos los sentidos:
Encontré eso aquí
fuente
char.IsWhiteSpace( array[ i -1 ] )
lugar de.. == ' '
, para manejar todo el espacio en blanco. 2) elimine los dos lugares que lo hacenif (char.isLower(..))
, no sirven para nada.ToUpper
simplemente no hace nada si un personaje no es minúscula.Ampliando la pregunta de Carlos anterior, si desea capitalizar varias oraciones, puede usar este código:
fuente
Posible solución para resolver su problema.
fuente