¿Cómo hago la primera letra de una cadena en mayúscula, pero no cambio el caso de ninguna de las otras letras?
Por ejemplo:
"this is a test"
->"This is a test"
"the Eiffel Tower"
->"The Eiffel Tower"
"/index.html"
->"/index.html"
javascript
string
letter
capitalize
Robert Wills
fuente
fuente
return str.replace(/(\b\w)/gi,function(m){return m.toUpperCase();});
string[0].toUpperCase() + string.substring(1)
`${s[0].toUpperCase()}${s.slice(1)}`
([initial, ...rest]) => [initial.toUpperCase(), ...rest].join("")
Respuestas:
La solución básica es:
Algunas otras respuestas se modifican
String.prototype
(esta respuesta también solía hacerlo), pero aconsejaría en contra de esto ahora debido a la capacidad de mantenimiento (difícil de averiguar dónde se agrega la funciónprototype
y podría causar conflictos si otro código usa el mismo nombre / un navegador agrega una función nativa con ese mismo nombre en el futuro).... y luego, hay mucho más en esta pregunta cuando se considera la internacionalización, como lo muestra esta asombrosamente buena respuesta (enterrada a continuación).
Si desea trabajar con puntos de código Unicode en lugar de unidades de código (por ejemplo, para manejar caracteres Unicode fuera del plano multilingüe básico), puede aprovechar el hecho de que
String#[@iterator]
funciona con puntos de código, y puede usarlotoLocaleUpperCase
para obtener mayúsculas de localización correcta:Para obtener aún más opciones de internacionalización, consulte la respuesta original a continuación .
fuente
the Eiffel Tower -> The Eiffel Tower
. Además, la función se llamacapitaliseFirstLetter
nocapitaliseFirstLetterAndLowerCaseAllTheOthers
.string[0].toUpperCase() + string.substring(1)
Aquí hay un enfoque más orientado a objetos:
Llamaría a la función, así:
Con la salida esperada siendo:
fuente
return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
En CSS:
fuente
Aquí hay una versión abreviada de la respuesta popular que obtiene la primera letra tratando la cadena como una matriz:
Actualizar:
De acuerdo con los comentarios a continuación, esto no funciona en IE 7 o inferior.
Actualización 2:
Para evitar
undefined
cadenas vacías (consulte el comentario de @ njzk2 a continuación ), puede verificar si hay una cadena vacía:fuente
return s && s[0].toUpperCase() + s.slice(1);
Si está interesado en el rendimiento de algunos métodos diferentes publicados:
Estos son los métodos más rápidos basados en esta prueba jsperf (ordenados de más rápido a más lento).
Como puede ver, los dos primeros métodos son esencialmente comparables en términos de rendimiento, mientras que la alteración
String.prototype
es, con mucho, la más lenta en términos de rendimiento.fuente
.slice(1)
con.substr(1)
mejoraría aún más el rendimiento.Para otro caso, lo necesito para poner en mayúscula la primera letra y poner en minúscula el resto. Los siguientes casos me hicieron cambiar esta función:
fuente
Esta es la solución ECMAScript 6+ 2018 :
fuente
.slice()
es más lento que.substring()
,str[0]
seríaundefined
para una cadena vacía y usar literales de plantilla para unir las dos partes introduce aquí 8 caracteres, mientras+
que solo introduciría 3.${}
solo agrega ruido.const newStr = str[0].toUpperCase() + str.slice(1);
Es más fácil de leer.Si ya está (o está considerando) usar
lodash
, la solución es fácil:Vea sus documentos: https://lodash.com/docs#capitalize
_.camelCase('Foo Bar'); //=> 'fooBar'
https://lodash.com/docs/4.15.0#camelCase
Vanilla js para la primera mayúscula:
fuente
Poner en mayúscula la primera letra de todas las palabras en una cadena:
fuente
s => s.split(' ').map(x => x[0].toUpperCase() + x.slice(1)).join(' ')
Podríamos obtener el primer personaje con uno de mis favoritos
RegExp
, parece un lindo smiley:/^./
Y para todos los adictos al café:
... y para todos los que piensan que hay una mejor manera de hacerlo, sin extender los prototipos nativos:
fuente
'Answer'.replace(/^./, v => v.toLowerCase())
Utilizar:
Saldrá
"Ruby java"
a la consola.fuente
Si usa underscore.js o Lo-Dash , la biblioteca underscore.string proporciona extensiones de cadena, que incluyen mayúsculas:
Ejemplo:
fuente
_.capitalize("foo") === "Foo"
.humanize
. Convierte una cuerda subrayada, camelizada o con guiones en una humanizada. También elimina los espacios en blanco iniciales y finales, y elimina el postfix '_id'.Y entonces:
Actualización de noviembre de 2016 (ES6), solo por diversión:
entonces
capitalize("hello") // Hello
fuente
const capitalize = ([first,...rest]) => first.toUpperCase() + rest.join('').toLowerCase();
.SHORTEST 3 soluciones, 1 y 2 manejan casos cuando la
s
cadena es""
,null
yundefined
:Mostrar fragmento de código
fuente
Solo CSS
::first-letter
, se aplica al primer carácter , es decir, en el caso de una cadena%a
, este selector se aplicaría%
y, como tala
, no se capitalizaría.:first-letter
).ES2015 de una sola línea
Como hay numerosas respuestas, pero ninguna en ES2015 que resolvería el problema original de manera eficiente, se me ocurrió lo siguiente:
Observaciones
parameters => function
se llama función de flecha .capitalizeFirstChar
lugar decapitalizeFirstLetter
, porque OP no pidió un código que ponga en mayúscula la primera letra de toda la cadena, sino el primer carácter (si es letra, por supuesto).const
nos da la capacidad de declararcapitalizeFirstChar
como constante, lo cual es deseable ya que como programador siempre debe indicar explícitamente sus intenciones.string.charAt(0)
ystring[0]
. Sin embargo,string[0]
tenga en cuenta que eso seríaundefined
para una cadena vacía, por lo que debe reescribirsestring && string[0]
, lo que es demasiado detallado, en comparación con la alternativa.string.substring(1)
es más rápido questring.slice(1)
.Punto de referencia
fuente
Hay una manera muy simple de implementarlo mediante el reemplazo . Para ECMAScript 6:
Resultado:
fuente
/^[a-z]/i
será mejor que usar.
ya que el anterior no intentará reemplazar ningún carácter que no sean alfabetosNo vi ninguna mención en las respuestas existentes de cuestiones relacionadas con los
puntos de código del plano astral o lainternacionalización. "Mayúsculas" no significa lo mismo en todos los idiomas que utilizan un script determinado.Inicialmente no vi ninguna respuesta que abordara los problemas relacionados con los puntos de código del plano astral. Hay uno , pero está un poco enterrado (¡como este, supongo!)
La mayoría de las funciones propuestas se ven así:
Sin embargo, algunos caracteres en mayúscula quedan fuera del BMP (plano multilingüe básico, puntos de código U + 0 a U + FFFF). Por ejemplo, tome este texto de Deseret:
El primer carácter aquí no puede capitalizarse porque las propiedades indexadas de la matriz de cadenas no acceden a "caracteres" o puntos de código *. Acceden a las unidades de código UTF-16. Esto también es cierto cuando se divide: los valores de índice apuntan a unidades de código.
Resulta que las unidades de código UTF-16 son 1: 1 con puntos de código USV dentro de dos rangos, U + 0 a U + D7FF y U + E000 a U + FFFF inclusive. La mayoría de los personajes en mayúsculas caen en esos dos rangos, pero no todos.
A partir de ES2015, lidiar con esto se volvió un poco más fácil.
String.prototype[@@iterator]
produce cadenas correspondientes a puntos de código **. Entonces, por ejemplo, podemos hacer esto:Para cadenas más largas, esto probablemente no sea terriblemente eficiente ***: realmente no necesitamos repetir el resto. Podríamos usar
String.prototype.codePointAt
para llegar a esa primera (posible) letra, pero aún tendríamos que determinar dónde debería comenzar el corte. Una forma de evitar iterar el resto sería probar si el primer punto de código está fuera del BMP; si no es así, el corte comienza en 1, y si lo es, el corte comienza en 2.Podrías usar matemática bit a bit en lugar de
> 0xFFFF
allí, pero probablemente sea más fácil de entender de esta manera y lograrías lo mismo.También podemos hacer que esto funcione en ES5 y versiones posteriores llevando esa lógica un poco más lejos si es necesario. No hay métodos intrínsecos en ES5 para trabajar con puntos de código, por lo que debemos probar manualmente si la primera unidad de código es un sustituto ****:
Al principio también mencioné consideraciones de internacionalización. Algunos de estos son muy difíciles de explicar porque requieren conocimiento no solo de qué idioma se está utilizando, sino que también pueden requerir un conocimiento específico de las palabras en el idioma. Por ejemplo, el dígrafo irlandés "mb" se capitaliza como "mB" al comienzo de una palabra. Otro ejemplo, el eszett alemán, nunca comienza una palabra (afaik), pero todavía ayuda a ilustrar el problema. La letra minúscula eszett ("ß") se escribe en mayúscula a "SS", pero "SS" podría minúscula a "ß" o "ss". ¡Se requiere conocimiento fuera de banda del idioma alemán para saber cuál es la correcta!
El ejemplo más famoso de este tipo de problemas, probablemente, es el turco. En latín turco, la forma mayúscula de i es İ, mientras que la forma minúscula de I es ı: son dos letras diferentes. Afortunadamente tenemos una forma de dar cuenta de esto:
En un navegador, la etiqueta de idioma más preferida del usuario se indica mediante
navigator.language
, se encuentra una lista en orden de preferencianavigator.languages
, y se puede obtener el idioma de un elemento DOM dado (generalmente) conObject(element.closest('[lang]')).lang || YOUR_DEFAULT_HERE
documentos en varios idiomas .En los agentes que admiten clases de caracteres de propiedad Unicode en RegExp, que se introdujeron en ES2018, podemos limpiar más aún expresando directamente en qué caracteres estamos interesados:
Esto podría modificarse un poco para manejar también mayúsculas múltiples palabras en una cadena con bastante buena precisión. La propiedad de carácter
CWU
o Changes_When_Uppercased coincide con todos los puntos de código que, bueno, cambian cuando se escribe en mayúscula. Podemos probar esto con caracteres de dígrafo enchapados en títulos como el holandés ij por ejemplo:En el momento de escribir este artículo (febrero de 2020), Firefox / Spidermonkey aún no ha implementado ninguna de las características RegExp introducidas en los últimos dos años *****. Puede verificar el estado actual de esta función en la tabla de compatibilidad de Kangax . Babel puede compilar literales RegExp con referencias de propiedad a patrones equivalentes sin ellos, pero tenga en cuenta que el código resultante puede ser enorme.
Con toda probabilidad, las personas que hagan esta pregunta no se preocuparán por la capitalización o la internacionalización de Deseret. Pero es bueno estar al tanto de estos problemas porque hay una buena posibilidad de que los encuentres eventualmente, incluso si no son preocupaciones actualmente. No son casos "límite", o mejor dicho, no son casos límite por definición : hay un país entero donde la mayoría de la gente habla turco, de todos modos, y la combinación de unidades de código con puntos de código es una fuente bastante común de errores (especialmente con respecto a los emoji). ¡Tanto las cadenas como el lenguaje son bastante complicados!
* Las unidades de código de UTF-16 / UCS2 también son puntos de código Unicode en el sentido de que, por ejemplo, U + D800 es técnicamente un punto de código, pero eso no es lo que "significa" aquí ... más o menos ... aunque se pone bastante borroso. Sin embargo, lo que los sustitutos definitivamente no son son los USV (valores escalares Unicode).
** Sin embargo, si una unidad de código sustituto está "huérfana", es decir, no forma parte de un par lógico, también podría obtener sustitutos aquí.
*** tal vez. No lo he probado. A menos que haya determinado que la capitalización es un cuello de botella significativo, probablemente no me preocupe, elija lo que considere más claro y legible.
**** tal función podría desear probar las unidades de código primera y segunda en lugar de solo la primera, ya que es posible que la primera unidad sea un sustituto huérfano. Por ejemplo, la entrada "\ uD800x" capitalizaría la X tal cual, lo que puede esperarse o no.
***** Aquí está el problema de Bugzilla si quieres seguir el progreso más directamente.
fuente
Parece ser más fácil en CSS:
Esto es de CSS Text -transform Property (en W3Schools ).
fuente
fuente
Siempre es mejor manejar este tipo de cosas usando CSS primero , en general, si puedes resolver algo usando CSS, ve por eso primero, luego prueba JavaScript para resolver tus problemas, así que en este caso intenta usar
:first-letter
CSS y aplicatext-transform:capitalize;
Intente crear una clase para eso, de modo que pueda usarla globalmente, por ejemplo:
.first-letter-uppercase
y agregue algo como a continuación en su CSS:También la opción alternativa es JavaScript, así que lo mejor será algo como esto:
y lo llaman así:
Si desea reutilizarlo una y otra vez, es mejor adjuntarlo a la cadena nativa de JavaScript, por lo que algo como a continuación:
y llámalo como a continuación:
fuente
Si desea volver a formatear el texto en mayúsculas, puede modificar los otros ejemplos como tales:
Esto asegurará que se cambie el siguiente texto:
fuente
fuente
substr
/substring
es un poco más semántico en comparación conslice
, pero eso es solo una cuestión de preferencia. Sin embargo, sí incluí ejemplos con las cadenas proporcionadas en la pregunta, que es un buen toque que no está presente en el ejemplo '09. Sinceramente, creo que todo se reduce a 15 años de mi deseo de karma en StackOverflow;)Aquí hay una función llamada ucfirst () (abreviatura de "primera letra mayúscula"):
Puede poner en mayúscula una cadena llamando a ucfirst ("alguna cadena") , por ejemplo,
Funciona dividiendo la cuerda en dos pedazos. En la primera línea, saca firstLetter y luego, en la segunda línea, capitaliza firstLetter llamando a firstLetter.toUpperCase () y lo une con el resto de la cadena, que se encuentra llamando a str.substr (1) .
Puede pensar que esto fallaría para una cadena vacía, y de hecho en un lenguaje como C, tendría que atender esto. Sin embargo, en JavaScript, cuando toma una subcadena de una cadena vacía, solo recupera una cadena vacía.
fuente
substr()
está en desuso? No es , incluso ahora, tres años después, y mucho menos en 2009 cuando hiciste este comentario.substr()
puede no estar marcado como obsoleto por ninguna implementación popular de ECMAScript (dudo que no vaya a desaparecer pronto), pero no es parte de la especificación de ECMAScript. La tercera edición de la especificación lo menciona en el anexo no normativo para "sugerir una semántica uniforme para tales propiedades sin hacer que las propiedades o su semántica formen parte de esta norma".substring
,substr
yslice
) es demasiado, IMO. Siempre lo usoslice
porque admite índices negativos, no tiene el comportamiento confuso de intercambio de argumentos y su API es similar a laslice
de otros idiomas.Uso:
Esta es una cadena de texto => Esta es una cadena de texto
fuente
return.this.toLocaleLowerCase().replace(
...String.prototype.capitalize = function(){ return this.replace( /(^|\s)[a-z]/g , function(m){ return m.toUpperCase(); }); };
Refactorizo un poco su código, solo necesita una primera coincidencia.fuente
Verifique esta solución:
fuente
stringVal.replace(/^./, stringVal[0].toUpperCase());
stringVal[0]
seríaundefined
para vacíostringVal
, y como tal el intento de acceder a la propiedad.toUpperCase()
arrojaría un error.(Puede encapsularlo en una función o incluso agregarlo al prototipo String si lo usa con frecuencia).
fuente
La
ucfirst
función funciona si lo haces así.Gracias JP por la aclaración.
fuente
string[0].toUpperCase() + string.substring(1)
(string[0] || '').toUpperCase() + string.substring(1)
(string[0] || '')
podrías simplementestring.charAt(0)
.Puedes hacerlo en una línea como esta
fuente
Encontré esta función de flecha más fácil. Reemplazar coincide con el primer carácter de letra (
\w
) de su cadena y lo convierte a mayúsculas. Nada más lujoso necesario.fuente
/./
por dos razones:/\w/
omitirá todos los caracteres anteriores que no sean letras (por lo que @@ abc se convertirá en @@ Abc), y luego no funcionará con caracteres no latinos