Como faço para que a primeira letra de uma string seja maiúscula, mas não altero o caso de nenhuma das outras letras?
Por exemplo:
"this is a test"
->"This is a test"
"the Eiffel Tower"
->"The Eiffel Tower"
"/index.html"
->"/index.html"
javascript
string
letter
capitalize
Robert Wills
fonte
fonte
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("")
Respostas:
A solução básica é:
Algumas outras respostas são modificadas
String.prototype
(essa resposta também costumava ser), mas eu não recomendaria isso agora, devido à capacidade de manutenção (difícil de descobrir onde a função está sendo adicionadaprototype
e pode causar conflitos se outro código usar o mesmo nome / navegador) adiciona uma função nativa com o mesmo nome no futuro).... e, então, há muito mais nessa questão quando você considera a internacionalização, como mostra essa resposta surpreendentemente boa (enterrada abaixo).
Se você deseja trabalhar com pontos de código Unicode em vez de unidades de código (por exemplo, para manipular caracteres Unicode fora do Plano Multilíngue Básico), pode aproveitar o fato de que
String#[@iterator]
funciona com pontos de código e pode usartoLocaleUpperCase
para obter maiúsculas e minúsculas:Para ainda mais opções de internacionalização, consulte a resposta original abaixo .
fonte
the Eiffel Tower -> The Eiffel Tower
. Além disso, a função é chamadacapitaliseFirstLetter
nãocapitaliseFirstLetterAndLowerCaseAllTheOthers
.string[0].toUpperCase() + string.substring(1)
Aqui está uma abordagem mais orientada a objetos:
Você chamaria a função, assim:
Com a saída esperada sendo:
fonte
return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
Em CSS:
fonte
Aqui está uma versão abreviada da resposta popular que recebe a primeira letra tratando a string como uma matriz:
Atualizar:
De acordo com os comentários abaixo, isso não funciona no IE 7 ou abaixo.
Atualização 2:
Para evitar
undefined
seqüências de caracteres vazias (consulte o comentário de @ njzk2 abaixo ), você pode verificar uma sequência de caracteres vazia:fonte
return s && s[0].toUpperCase() + s.slice(1);
Se você estiver interessado no desempenho de alguns métodos diferentes publicados:
Aqui estão os métodos mais rápidos com base neste teste jsperf (ordenado do mais rápido para o mais lento).
Como você pode ver, os dois primeiros métodos são essencialmente comparáveis em termos de desempenho, enquanto alterar o
String.prototype
é de longe o mais lento em termos de desempenho.fonte
.slice(1)
por.substr(1)
melhoraria ainda mais o desempenho.Para outro caso, preciso que ela coloque em maiúscula a primeira letra e minúscula o restante. Os seguintes casos me fizeram mudar esta função:
fonte
Esta é a solução ECMAScript 6+ 2018 :
fonte
.slice()
é mais lento do que.substring()
,str[0]
seriaundefined
para uma cadeia vazia e usando literais de modelo para juntar as duas introduz peças aqui 8 caracteres, enquanto que+
iria introduzir única 3.${}
just adiciona ruído.const newStr = str[0].toUpperCase() + str.slice(1);
é mais fácil de ler.Se você já está (ou está pensando em usar)
lodash
, a solução é fácil:Consulte os documentos: https://lodash.com/docs#capitalize
_.camelCase('Foo Bar'); //=> 'fooBar'
https://lodash.com/docs/4.15.0#camelCase
Baunilha js para a primeira letra maiúscula:
fonte
Coloque em maiúscula a primeira letra de todas as palavras em uma sequência:
fonte
s => s.split(' ').map(x => x[0].toUpperCase() + x.slice(1)).join(' ')
Poderíamos conseguir o primeiro personagem com um dos meus favoritos
RegExp
, parece um smiley fofo:/^./
E para todos os viciados em café:
... e para todos os que pensam que há uma maneira melhor de fazer isso, sem estender os protótipos nativos:
fonte
'Answer'.replace(/^./, v => v.toLowerCase())
Usar:
Ele será exibido
"Ruby java"
no console.fonte
Se você usar underscore.js ou Lo-Dash , a biblioteca underscore.string fornecerá extensões de cadeia, incluindo maiúsculas:
Exemplo:
fonte
_.capitalize("foo") === "Foo"
.humanize
. Ele converte uma string sublinhada, camelizada ou dasherized em uma humanizada. Também remove os espaços em branco iniciais e finais e remove o postfix '_id'.E depois:
Atualize Nov.2016 (ES6), apenas por diversão:
então
capitalize("hello") // Hello
fonte
const capitalize = ([first,...rest]) => first.toUpperCase() + rest.join('').toLowerCase();
.MAIS CURTO 3 soluções, 1 e 2 casos punho quando
s
string é""
,null
eundefined
:Mostrar snippet de código
fonte
Apenas CSS
::first-letter
, ele se aplica ao primeiro caractere , ou seja, no caso de string%a
, esse seletor se aplicaria%
e, como tala
, não seria maiúsculo.:first-letter
).ES2015 one-liner
Como existem inúmeras respostas, mas nenhuma no ES2015 que resolveria o problema original de forma eficiente, vim com o seguinte:
Observações
parameters => function
é a chamada função de seta .capitalizeFirstChar
vez decapitalizeFirstLetter
, porque o OP não solicitou código que colocasse em maiúscula a primeira letra de toda a string, mas o primeiro caractere (se for letra, é claro).const
nos dá a capacidade de declararcapitalizeFirstChar
como constante, o que é desejado, pois como programador você deve sempre declarar explicitamente suas intenções.string.charAt(0)
estring[0]
. Observe, no entanto, questring[0]
seriaundefined
para uma string vazia, portanto, ela deve ser reescrita parastring && string[0]
, que é muito detalhada, em comparação com a alternativa.string.substring(1)
é mais rápido questring.slice(1)
.Referência
fonte
Existe uma maneira muito simples de implementá-lo por substituição . Para ECMAScript 6:
Resultado:
fonte
/^[a-z]/i
será melhor do que usar.
como o anterior não tentará substituir qualquer carácter diferente de alfabetosParece ser mais fácil no CSS:
Isto é da propriedade de transformação de texto CSS (na W3Schools ).
fonte
fonte
Não vi menção nas respostas existentes de questões relacionadas a
pontos de código do plano astral ou àinternacionalização. "Maiúsculas" não significa a mesma coisa em todos os idiomas usando um determinado script.Inicialmente, não encontrei respostas abordando questões relacionadas aos pontos de código do plano astral. Há um , mas está um pouco enterrado (como este, eu acho!)
A maioria das funções propostas é assim:
No entanto, alguns caracteres em caixa ficam fora do BMP (plano multilíngue básico, pontos de código U + 0 a U + FFFF). Por exemplo, pegue este texto Deseret:
O primeiro caractere aqui falha ao capitalizar porque as propriedades de cadeias indexadas por matriz não acessam "caracteres" ou pontos de código *. Eles acessam unidades de código UTF-16. Isso também é verdade ao fatiar - os valores do índice apontam para as unidades de código.
Acontece que as unidades de código UTF-16 são 1: 1 com pontos de código USV em dois intervalos, U + 0 a U + D7FF e U + E000 a U + FFFF, inclusive. A maioria dos personagens incluídos se encaixa nesses dois intervalos, mas não em todos eles.
A partir do ES2015, lidar com isso ficou um pouco mais fácil.
String.prototype[@@iterator]
produz strings correspondentes aos pontos de código **. Então, por exemplo, podemos fazer isso:Para seqüências mais longas, isso provavelmente não é muito eficiente *** - não precisamos iterar o restante. Poderíamos usar
String.prototype.codePointAt
para chegar à primeira letra (possível), mas ainda precisaríamos determinar onde a fatia deveria começar. Uma maneira de evitar a repetição do restante seria testar se o primeiro ponto de código está fora do BMP; se não estiver, a fatia começará em 1 e, se estiver, a fatia começará em 2.Você pode usar a matemática bit a bit em vez de
> 0xFFFF
lá, mas provavelmente é mais fácil entender dessa maneira e conseguiria a mesma coisa.Também podemos fazer isso funcionar no ES5 e abaixo, levando essa lógica um pouco mais longe, se necessário. Não há métodos intrínsecos no ES5 para trabalhar com pontos de código, portanto, precisamos testar manualmente se a primeira unidade de código é uma substituta ****:
No início, também mencionei considerações sobre internacionalização. Algumas delas são muito difíceis de serem explicadas porque exigem conhecimento não apenas de qual idioma está sendo usado, mas também podem exigir conhecimento específico das palavras no idioma. Por exemplo, o dígrafo irlandês "mb" coloca em maiúscula como "mB" no início de uma palavra. Outro exemplo, o eszett alemão, nunca inicia uma palavra (afaik), mas ainda ajuda a ilustrar o problema. O eszett em minúsculas ("ß") coloca em maiúscula em "SS", mas "SS" pode em minúsculas em "ß" ou "ss" - é necessário conhecimento fora da banda do idioma alemão para saber qual é o correto!
O exemplo mais famoso desses tipos de questões, provavelmente, é o turco. No latim turco, a forma maiúscula de i é ©, enquanto a minúscula de I é i - são duas letras diferentes. Felizmente, temos uma maneira de explicar isso:
Em um navegador, a tag de idioma mais preferida do usuário é indicada por
navigator.language
, uma lista em ordem de preferência é encontrada emnavigator.languages
e um determinado idioma do elemento DOM pode ser obtido (geralmente)Object(element.closest('[lang]')).lang || YOUR_DEFAULT_HERE
em documentos em vários idiomas.Nos agentes que oferecem suporte às classes de caracteres de propriedade Unicode no RegExp, introduzidos no ES2018, podemos limpar ainda mais as coisas expressando diretamente em quais caracteres estamos interessados:
Isso pode ser ajustado um pouco para também manipular letras maiúsculas em várias palavras com uma precisão bastante boa. A propriedade de caractere
CWU
ou Changes_When_Uppercased corresponde a todos os pontos de código que, assim, mudam quando estão em maiúsculas. Podemos tentar isso com caracteres digigráficos com letras maiúsculas como o holandês ij, por exemplo:No momento da redação deste artigo (fevereiro de 2020), o Firefox / Spidermonkey ainda não havia implementado nenhum dos recursos RegExp introduzidos nos últimos dois anos *****. Você pode verificar o status atual desse recurso na tabela de compatibilidade Kangax . Babel é capaz de compilar literais RegExp com referências de propriedades a padrões equivalentes sem eles, mas esteja ciente de que o código resultante pode ser enorme.
Com toda a probabilidade, as pessoas que fazem essa pergunta não se preocuparão com a capitalização ou internacionalização da Deseret. Mas é bom estar ciente desses problemas, porque há uma boa chance de que você os encontre eventualmente, mesmo que não sejam preocupações no momento. Eles não são casos extremos, ou melhor, não são casos extremos por definição - existe um país inteiro onde a maioria das pessoas fala turco, de qualquer maneira, e a confluência de unidades de código com pontos de código é uma fonte bastante comum de bugs (especialmente com em relação a emoji). Ambas as strings e a linguagem são bastante complicadas!
* As unidades de código do UTF-16 / UCS2 também são pontos de código Unicode no sentido de que, por exemplo, o U + D800 é tecnicamente um ponto de código, mas não é isso que "significa" aqui ... mais ou menos ... embora fique bonito difusa. O que os substitutos definitivamente não são, no entanto, são os USVs (valores escalares Unicode).
** Embora se uma unidade de código substituto for "órfã" - isto é, não faz parte de um par lógico - você ainda poderá obter substitutos aqui também.
*** talvez. Eu não testei. A menos que você tenha determinado que a capitalização é um gargalo significativo, eu provavelmente não a suoria - escolha o que você achar mais claro e legível.
**** Essa função pode desejar testar a primeira e a segunda unidades de código em vez de apenas a primeira, pois é possível que a primeira unidade seja uma substituta órfã. Por exemplo, a entrada "\ uD800x" colocaria em maiúscula o X como está, o que pode ou não ser esperado.
***** Aqui está a questão do Bugzilla, se você quiser acompanhar o progresso mais diretamente.
fonte
É sempre melhor lidar com esses tipos de coisas usando CSS primeiro , em geral, se você pode resolver algo usando CSS, faça isso primeiro e tente o JavaScript para resolver seus problemas. Portanto, nesse caso, tente usar
:first-letter
CSS e apliquetext-transform:capitalize;
Portanto, tente criar uma classe para isso, para que você possa usá-la globalmente, por exemplo:
.first-letter-uppercase
e adicione algo como abaixo no seu CSS:Além disso, a opção alternativa é JavaScript, então o melhor será algo como isto:
e chame assim:
Se você deseja reutilizá-lo repetidamente, é melhor anexá-lo à String nativa do javascript, então algo como abaixo:
e chame como abaixo:
fonte
Se você deseja reformatar o texto com letras maiúsculas, modifique os outros exemplos como:
Isso garantirá que o seguinte texto seja alterado:
fonte
fonte
substr
/substring
é um pouco mais semântico em oposição aslice
, mas isso é apenas uma questão de preferência. No entanto, incluí exemplos com as strings fornecidas na pergunta, que é um toque agradável que não está presente no exemplo '09. Sinceramente, acho que tudo se resume a 15 anos de idade me querendo karma em StackOverflow;)Aqui está uma função chamada ucfirst () (abreviação de "primeira letra maiúscula"):
Você pode colocar em maiúscula uma string chamando ucfirst ("some string") - por exemplo,
Ele funciona dividindo a corda em duas partes. Na primeira linha, ele extrai firstLetter e, na segunda linha, coloca em maiúscula firstLetter chamando firstLetter.toUpperCase () e o une ao restante da string, que é encontrada chamando str.substr (1) .
Você pode pensar que isso falharia em uma string vazia e, de fato, em um idioma como C, você teria que atender a isso. No entanto, no JavaScript, quando você pega uma substring de uma string vazia, você apenas recebe uma string vazia de volta.
fonte
substr()
está obsoleto? Ainda não é , três anos depois, e muito menos em 2009, quando você fez esse comentário.substr()
pode não ser marcado como reprovado por qualquer implementação popular do ECMAScript (duvido que não desapareça tão cedo), mas não faz parte das especificações do ECMAScript. A 3ª edição das especificações menciona isso no anexo não normativo para "sugerir semântica uniforme para essas propriedades sem tornar as propriedades ou suas semânticas parte deste padrão".substring
,substr
eslice
) é demais, IMO. Eu sempre usoslice
porque ele suporta índices negativos, não possui o comportamento confuso de troca de argumentos e sua API é semelhante aslice
outras linguagens.Uso:
Esta é uma sequência de texto => Esta é uma sequência de texto
fonte
return.this.toLocaleLowerCase().replace(
...String.prototype.capitalize = function(){ return this.replace( /(^|\s)[a-z]/g , function(m){ return m.toUpperCase(); }); };
Refatoro um pouco seu código, você precisa apenas de uma primeira correspondência.fonte
Faça o checkout desta solução:
fonte
stringVal.replace(/^./, stringVal[0].toUpperCase());
stringVal[0]
seriaundefined
vaziostringVal
, e, como tal, a tentativa de acessar a propriedade.toUpperCase()
geraria um erro.(Você pode encapsulá-lo em uma função ou até mesmo adicioná-lo ao protótipo String, se você o usar com frequência.)
fonte
A
ucfirst
função funciona se você fizer assim.Obrigado JP pela aclaração.
fonte
string[0].toUpperCase() + string.substring(1)
(string[0] || '').toUpperCase() + string.substring(1)
(string[0] || '')
você poderia apenasstring.charAt(0)
.Você pode fazer isso em uma linha como esta
fonte
Eu achei essa função de seta mais fácil. Substituir corresponde ao primeiro caractere da letra (
\w
) da sua sequência e o converte em maiúsculas. Nada extravagante necessário.fonte
/./
para dois motivos:/\w/
irá ignorar todos os não anterior carta caracteres (assim @@ abc vai se tornar @@ Abc), e então ele não funciona com caracteres não-latinos