Comment puis-je mettre la première lettre d'une chaîne en majuscules sans changer la casse des autres lettres?
Par exemple:
"this is a test"
->"This is a test"
"the Eiffel Tower"
->"The Eiffel Tower"
"/index.html"
->"/index.html"
javascript
string
letter
capitalize
Robert Wills
la source
la source
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("")
Réponses:
La solution de base est:
Certaines autres réponses sont modifiées
String.prototype
(cette réponse aussi), mais je déconseille cela maintenant en raison de la maintenabilité (difficile de savoir où la fonction est ajoutée à laprototype
et pourrait provoquer des conflits si un autre code utilise le même nom / un navigateur ajoute une fonction native avec ce même nom à l'avenir).... et puis, il y a tellement plus à cette question quand on considère l'internationalisation, comme montre cette étonnamment bonne réponse (enterrée ci-dessous).
Si vous souhaitez travailler avec des points de code Unicode au lieu d'unités de code (par exemple pour gérer des caractères Unicode en dehors du plan multilingue de base), vous pouvez tirer parti du fait que cela
String#[@iterator]
fonctionne avec des points de code, et vous pouvez utilisertoLocaleUpperCase
pour obtenir des majuscules correctes pour les paramètres régionaux:Pour encore plus d'options d'internationalisation, veuillez consulter la réponse d'origine ci-dessous .
la source
the Eiffel Tower -> The Eiffel Tower
. De plus, la fonction n'estcapitaliseFirstLetter
pas appeléecapitaliseFirstLetterAndLowerCaseAllTheOthers
.string[0].toUpperCase() + string.substring(1)
Voici une approche plus orientée objet:
Vous appelleriez la fonction, comme ceci:
Avec la sortie attendue étant:
la source
return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
En CSS:
la source
Voici une version abrégée de la réponse populaire qui obtient la première lettre en traitant la chaîne comme un tableau:
Mise à jour:
Selon les commentaires ci-dessous, cela ne fonctionne pas dans IE 7 ou ci-dessous.
Mise à jour 2:
Pour éviter
undefined
les chaînes vides (voir le commentaire de @ njzk2 ci-dessous ), vous pouvez rechercher une chaîne vide:la source
return s && s[0].toUpperCase() + s.slice(1);
Si vous êtes intéressé par les performances de quelques méthodes différentes publiées:
Voici les méthodes les plus rapides basées sur ce test jsperf (classées du plus rapide au plus lent).
Comme vous pouvez le voir, les deux premières méthodes sont essentiellement comparables en termes de performances, alors que la modification de la
String.prototype
est de loin la plus lente en termes de performances.la source
.slice(1)
par.substr(1)
améliorerait encore les performances.Pour un autre cas, j'en ai besoin pour mettre en majuscule la première lettre et minuscule le reste. Les cas suivants m'ont fait changer cette fonction:
la source
Voici la solution ECMAScript 6+ 2018 :
la source
.slice()
est plus lent que.substring()
,str[0]
seraitundefined
pour une chaîne vide et l'utilisation de littéraux de modèle pour joindre les deux parties introduit ici 8 caractères, alors qu'il+
n'en introduirait que 3.${}
ajoute juste du bruit.const newStr = str[0].toUpperCase() + str.slice(1);
est plus facile à lire.Si vous utilisez déjà (ou envisagez) d'utiliser
lodash
, la solution est simple:Voir leurs documents: https://lodash.com/docs#capitalize
_.camelCase('Foo Bar'); //=> 'fooBar'
https://lodash.com/docs/4.15.0#camelCase
Vanilla js pour le premier majuscule:
la source
Mettez en majuscule la première lettre de tous les mots d'une chaîne:
la source
s => s.split(' ').map(x => x[0].toUpperCase() + x.slice(1)).join(' ')
Nous pourrions obtenir le premier personnage avec l'un de mes préférés
RegExp
, ressemble à un joli smiley:/^./
Et pour tous les accros au café:
... et pour tous les gars qui pensent qu'il existe une meilleure façon de procéder, sans étendre les prototypes natifs:
la source
'Answer'.replace(/^./, v => v.toLowerCase())
Utilisation:
Il sortira
"Ruby java"
sur la console.la source
Si vous utilisez underscore.js ou Lo-Dash , la bibliothèque underscore.string fournit des extensions de chaîne, y compris les majuscules:
Exemple:
la source
_.capitalize("foo") === "Foo"
.humanize
. Il convertit une chaîne soulignée, camélisée ou dashérisée en une chaîne humanisée. Supprime également les espaces de début et de fin et supprime le suffixe «_id».Et alors:
Mise à jour de novembre 2016 (ES6), juste pour le FUN:
puis
capitalize("hello") // Hello
la source
const capitalize = ([first,...rest]) => first.toUpperCase() + rest.join('').toLowerCase();
.3 solutions LES PLUS COURTES , 1 et 2 traitent les cas lorsque la
s
chaîne est""
,null
etundefined
:Afficher l'extrait de code
la source
CSS uniquement
::first-letter
, il s'applique au premier caractère , c'est-à-dire qu'en cas de chaîne%a
, ce sélecteur s'appliquerait à%
et en tant que tela
ne serait pas mis en majuscule.:first-letter
).ES2015 une doublure
Puisqu'il existe de nombreuses réponses, mais aucune dans ES2015 qui résoudrait efficacement le problème d'origine, j'ai trouvé ce qui suit:
Remarques
parameters => function
est ce qu'on appelle la fonction flèche .capitalizeFirstChar
au lieu decapitalizeFirstLetter
, car OP n'a pas demandé de code qui met en majuscule la première lettre de la chaîne entière, mais le tout premier caractère (si c'est une lettre, bien sûr).const
nous donne la possibilité de déclarercapitalizeFirstChar
comme constante, ce qui est souhaité car en tant que programmeur, vous devez toujours indiquer explicitement vos intentions.string.charAt(0)
etstring[0]
. Notez cependant que cestring[0]
seraitundefined
pour une chaîne vide, donc elle devrait être réécritestring && string[0]
, ce qui est beaucoup trop verbeux, par rapport à l'alternative.string.substring(1)
est plus rapide questring.slice(1)
.Référence
la source
Il existe un moyen très simple de l'implémenter par replace . Pour ECMAScript 6:
Résultat:
la source
/^[a-z]/i
sera meilleure que l'utilisation,.
car la précédente n'essaiera pas de remplacer un caractère autre que les alphabetsJe n'ai vu aucune mention dans les réponses existantes de problèmes liés aux
points de code du plan astral ou à l'internationalisation. «Majuscule» ne signifie pas la même chose dans toutes les langues utilisant un script donné.Au début, je n'ai vu aucune réponse concernant les problèmes liés aux points de code du plan astral. Il y en a un , mais il est un peu enterré (comme celui-ci, je suppose!)
La plupart des fonctions proposées ressemblent à ceci:
Cependant, certains caractères placés en dehors du BMP (plan multilingue de base, points de code U + 0 à U + FFFF). Par exemple, prenez ce texte Deseret:
Le premier caractère ici ne parvient pas à mettre en majuscule parce que les propriétés indexées de tableau des chaînes n'accèdent pas aux «caractères» ou aux points de code *. Ils accèdent aux unités de code UTF-16. Cela est également vrai lors du découpage - les valeurs d'index pointent vers les unités de code.
Il se trouve que les unités de code UTF-16 sont 1: 1 avec des points de code USV dans deux plages, U + 0 à U + D7FF et U + E000 à U + FFFF inclus. La plupart des personnages encaissés entrent dans ces deux gammes, mais pas tous.
À partir d'ES2015, le traitement de ce problème est devenu un peu plus facile.
String.prototype[@@iterator]
renvoie des chaînes correspondant aux points de code **. Ainsi, par exemple, nous pouvons le faire:Pour les cordes plus longues, ce n'est probablement pas terriblement efficace *** - nous n'avons pas vraiment besoin d'itérer le reste. Nous pourrions utiliser
String.prototype.codePointAt
pour obtenir cette première lettre (possible), mais nous aurions encore besoin de déterminer où la tranche devrait commencer. Une façon d'éviter d'itérer le reste serait de tester si le premier point de code est en dehors du BMP; si ce n'est pas le cas, la tranche commence à 1, et si c'est le cas, la tranche commence à 2.Vous pouvez utiliser des mathématiques au niveau du bit au lieu de
> 0xFFFF
là, mais c'est probablement plus facile à comprendre de cette façon et l'une ou l'autre obtiendrait la même chose.Nous pouvons également faire ce travail dans ES5 et ci-dessous en poussant un peu plus loin cette logique si nécessaire. Il n'y a pas de méthodes intrinsèques dans ES5 pour travailler avec les points de code, nous devons donc tester manuellement si la première unité de code est un substitut ****:
Au début, j'ai également mentionné des considérations d'internationalisation. Certains d' entre eux sont très difficiles à expliquer parce qu'ils ont besoin de connaissances non seulement de ce que la langue est utilisée, mais peut aussi exiger des connaissances spécifiques des mots dans la langue. Par exemple, le digraphe irlandais "mb" est mis en majuscule comme "mB" au début d'un mot. Un autre exemple, l'eszett allemand, ne commence jamais un mot (afaik), mais aide toujours à illustrer le problème. L'eszett en minuscule («ß») met en majuscule «SS», mais «SS» peut minuscule en «ß» ou «ss» - vous avez besoin d'une connaissance hors bande de la langue allemande pour savoir ce qui est correct!
L'exemple le plus célèbre de ce genre de problèmes est probablement le turc. En latin turc, la forme majuscule de i est ©, tandis que la forme minuscule de I est ı - ce sont deux lettres différentes. Heureusement, nous avons un moyen de tenir compte de cela:
Dans un navigateur, la balise de langue préférée de l'utilisateur est indiquée par
navigator.language
, une liste par ordre de préférence est trouvée surnavigator.languages
, et la langue d'un élément DOM donné peut être obtenue (généralement) avecObject(element.closest('[lang]')).lang || YOUR_DEFAULT_HERE
dans des documents multilingues.Dans les agents qui prennent en charge les classes de caractères de propriété Unicode dans RegExp, qui ont été introduites dans ES2018, nous pouvons nettoyer davantage les choses en exprimant directement les caractères qui nous intéressent:
Cela pourrait être légèrement modifié pour gérer également plusieurs mots en majuscule dans une chaîne avec une assez bonne précision. La propriété de caractère
CWU
ou Changes_When_Uppercased correspond à tous les points de code qui, ainsi, changent lorsqu'ils sont en majuscule. Nous pouvons essayer cela avec un caractère digraphique en titane comme le néerlandais ij par exemple:Au moment de la rédaction (février 2020), Firefox / Spidermonkey n'avait encore implémenté aucune des fonctionnalités RegExp introduites au cours des deux dernières années *****. Vous pouvez vérifier l'état actuel de cette fonctionnalité dans le tableau compat Kangax . Babel est capable de compiler des littéraux RegExp avec des références de propriété à des modèles équivalents sans eux, mais sachez que le code résultant peut être énorme.
Selon toute vraisemblance, les personnes qui poseront cette question ne seront pas concernées par la capitalisation ou l'internationalisation de Deseret. Mais il est bon d'être conscient de ces problèmes, car il y a de fortes chances que vous les rencontriez éventuellement même si ce ne sont pas des problèmes pour le moment. Ce ne sont pas des cas marginaux, ou plutôt, ce ne sont pas des cas marginaux par définition - il y a tout un pays où la plupart des gens parlent le turc, de toute façon, et la fusion des unités de code avec des points de code est une source assez courante de bogues (en particulier avec en ce qui concerne les emoji). Les chaînes et la langue sont assez compliquées!
* Les unités de code de l'UTF-16 / UCS2 sont également des points de code Unicode dans le sens où, par exemple, U + D800 est techniquement un point de code, mais ce n'est pas ce que cela "signifie" ici ... en quelque sorte ... même si cela devient joli flou. Ce que les substituts ne sont certainement pas, cependant, ce sont les USV (valeurs scalaires Unicode).
** Bien que si une unité de code de substitution est «orpheline» - c'est-à-dire qu'elle ne fait pas partie d'une paire logique - vous pouvez toujours obtenir des substituts ici aussi.
*** peut être. Je ne l'ai pas testé. À moins que vous n'ayez déterminé que la capitalisation est un goulot d'étranglement significatif, je ne le suerais probablement pas - choisissez ce que vous pensez être le plus clair et le plus lisible.
**** une telle fonction pourrait souhaiter tester à la fois la première et la seconde unités de code au lieu de la première, car il est possible que la première unité soit un substitut orphelin. Par exemple, l'entrée "\ uD800x" mettrait en majuscule le X tel quel, ce qui peut ou non être attendu.
***** Voici le problème de Bugzilla si vous souhaitez suivre la progression plus directement.
la source
Cela semble plus simple en CSS:
Ceci provient de la propriété CSS text-transform (sur W3Schools ).
la source
la source
Il est toujours préférable de gérer ce genre de choses en utilisant d' abord CSS , en général, si vous pouvez résoudre quelque chose en utilisant CSS, allez-y d'abord, puis essayez JavaScript pour résoudre vos problèmes, alors dans ce cas essayez d'utiliser
:first-letter
en CSS et appliqueztext-transform:capitalize;
Essayez donc de créer une classe pour cela, afin de pouvoir l'utiliser globalement, par exemple:
.first-letter-uppercase
et ajoutez quelque chose comme ci-dessous dans votre CSS:De plus, l'option alternative est JavaScript, donc le mieux va être quelque chose comme ça:
et appelez-le comme:
Si vous souhaitez le réutiliser encore et encore, il est préférable de le joindre à la chaîne native javascript, donc quelque chose comme ci-dessous:
et appelez-le comme ci-dessous:
la source
Si vous souhaitez reformater le texte en majuscules, vous pouvez modifier les autres exemples en tant que tels:
Cela garantira que le texte suivant est modifié:
la source
la source
substr
/substring
est un peu plus sémantique par opposition àslice
, mais c'est juste une question de préférence. J'ai toutefois inclus des exemples avec les chaînes fournies dans la question, ce qui est une belle touche non présente dans l'exemple '09. Je pense honnêtement que cela se résume à 15 ans, je veux du karma sur StackOverflow;)Voici une fonction appelée ucfirst () (abréviation de "majuscule première lettre"):
Vous pouvez mettre une chaîne en majuscule en appelant ucfirst ("une chaîne") - par exemple,
Il fonctionne en divisant la chaîne en deux morceaux. Sur la première ligne, il extrait firstLetter , puis sur la deuxième ligne, il capitalise firstLetter en appelant firstLetter.toUpperCase () et le joint au reste de la chaîne, qui est trouvé en appelant str.substr (1) .
Vous pourriez penser que cela échouerait pour une chaîne vide, et en effet, dans un langage comme C, vous devrez répondre à cela. Cependant, en JavaScript, lorsque vous prenez une sous-chaîne d'une chaîne vide, vous obtenez simplement une chaîne vide.
la source
substr()
c'est obsolète? Ce n'est pas , même maintenant, trois ans plus tard, encore moins en 2009 lorsque vous avez fait ce commentaire.substr()
peut ne pas être marqué comme déconseillé par une implémentation ECMAScript populaire (je doute que cela ne disparaisse pas de si tôt), mais cela ne fait pas partie de la spécification ECMAScript. La 3e édition de la spécification le mentionne dans l'annexe non normative afin de "suggérer une sémantique uniforme pour ces propriétés sans faire des propriétés ou de leur sémantique une partie de cette norme".substring
,substr
etslice
), c'est trop, OMI. J'utilise toujoursslice
parce qu'il prend en charge les index négatifs, il n'a pas le comportement de permutation d'arguments déroutant et son API est similaire àslice
dans d'autres langues.Usage:
Ceci est une chaîne de texte => Ceci est une chaîne de texte
la source
return.this.toLocaleLowerCase().replace(
...String.prototype.capitalize = function(){ return this.replace( /(^|\s)[a-z]/g , function(m){ return m.toUpperCase(); }); };
Je refaçonne un peu votre code, vous n'avez besoin que d'une première correspondance.la source
Découvrez cette solution:
la source
stringVal.replace(/^./, stringVal[0].toUpperCase());
stringVal[0]
seraitundefined
pour videstringVal
, et en tant que tel, tenter d'accéder à la propriété.toUpperCase()
jetterait une erreur.(Vous pouvez l'encapsuler dans une fonction ou même l'ajouter au prototype String si vous l'utilisez fréquemment.)
la source
La
ucfirst
fonction fonctionne si vous le faites comme ça.Merci JP pour cette déclaration.
la source
string[0].toUpperCase() + string.substring(1)
(string[0] || '').toUpperCase() + string.substring(1)
(string[0] || '')
vous pourriez tout simplementstring.charAt(0)
.Vous pouvez le faire en une seule ligne comme celle-ci
la source
J'ai trouvé cette fonction de flèche la plus simple. Remplacer correspond au premier caractère de lettre (
\w
) de votre chaîne et le convertit en majuscule. Rien de plus sophistiqué nécessaire.la source
/./
pour deux raisons:/\w/
sautera tous les caractères précédents non-lettre (donc @@ abc deviendra @@ Abc), puis cela ne fonctionnera pas avec les caractères non latins