Mettre en majuscule la première lettre de la chaîne dans AngularJs

134

Je veux mettre en majuscule le premier caractère de la chaîne dans angularjs

Comme je l'ai utilisé {{ uppercase_expression | uppercase}}, convertissez toute la chaîne en majuscules.

Piyush
la source
1
Oui, vous devrez écrire du code. Angular ne fera pas tout pour vous. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… , developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
JB Nizet
11
Cela peut également être fait en utilisant CSS. Découvrez le text-transform: capitalize property
Ramanathan Muthuraman
1
Vous pouvez utiliser cette solution si vous voulez vraiment utiliser angular: codepen.io/WinterJoey/pen/sfFaK
Yousef_Shamshoum
1
créez une directive / filtre simple qui fera de la première lettre du mot une majuscule pour vous ...
Pankaj Parkar

Réponses:

234

utiliser ce filtre de capitalisation

var app = angular.module('app', []);

app.controller('Ctrl', function ($scope) {
   $scope.msg = 'hello, world.';
});

app.filter('capitalize', function() {
    return function(input) {
      return (angular.isString(input) && input.length > 0) ? input.charAt(0).toUpperCase() + input.substr(1).toLowerCase() : input;
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">
    <div ng-controller="Ctrl">
        <p><b>My Text:</b> {{msg | capitalize}}</p>
    </div>
</div>

Nidhish Krishnan
la source
11
Vous obtenez une erreur si vous souhaitez mettre accidentellement un nombre en majuscule. Devrait être ce corps de la fonction: return (angular.isString(s) && s.length > 0) ? s[0].toUpperCase() + s.substr(1).toLowerCase() : s;. Si ce n'est pas une chaîne, renvoyez-la inchangée.
Jabba
2
Voici le filtre de capitalisation personnalisé codepen.io/WinterJoey/pen/sfFaK
Michal
148

Je dirais de ne pas utiliser angular / js car vous pouvez simplement utiliser css à la place:

Dans votre css, ajoutez la classe:

.capitalize {
   text-transform: capitalize;
}

Ensuite, enveloppez simplement l'expression (par exemple) dans votre html:

<span class="capitalize">{{ uppercase_expression }}</span>

Aucun js nécessaire;)

TrampGuy
la source
7
Cette transformation mettra en majuscule la première lettre de chaque mot et ne s'applique donc qu'aux chaînes d'un mot
jakub.g
22
@ jakub.g Si vous voulez juste mettre en majuscule le premier mot (enfin, lettre), expliquez simplement le sélecteur css avec le sélecteur de :first-letterpseudo-élément. Reste-t-il autre chose à découvert? :)
Philzen
2
@Philzen Oui! Comment feriez-vous avec html uniquement? ;-)
Romain Vincent
@RomainVincent Qu'entendez-vous par "HTML uniquement"? Peut-être que ma réponse ci-dessous aide (cliquez simplement sur "Exécuter l'extrait de code" pour le voir en action). Le contenu HTML est statique, vous devrez au moins ajouter du CSS ou du JS pour modifier son style, respectivement le contenu DOM.
Philzen
4
Je suis désolé, c'était une mauvaise tentative de faire une blague.
Romain Vincent
57

Si vous utilisez Bootstrap , vous pouvez simplement ajouter la text-capitalizeclasse d'assistance:

<p class="text-capitalize">CapiTaliZed text.</p>

EDIT: juste au cas où le lien meurt à nouveau:

Transformation de texte

Transformez le texte en composants avec des classes de capitalisation de texte.

texte en minuscules.
TEXTE EN MAJUSCULE.
Texte CapiTaliZed.

<p class="text-lowercase">Lowercased text.</p>
<p class="text-uppercase">Uppercased text.</p>
<p class="text-capitalize">CapiTaliZed text.</p>

Notez que la mise en majuscule du texte ne modifie que la première lettre de chaque mot, laissant la casse des autres lettres inchangée.

minimalpop
la source
Moyen rapide et facile d'atteindre l'objectif, cela met également en majuscule la première lettre de chaque mot de la chaîne, ce qui est cool.
kisanme
dans les coulisses, c'est juste en utilisanttext-transform: capitalize;
cameck
27

Si vous utilisez Angular 4+, vous pouvez simplement utiliser titlecase

{{toUppercase | titlecase}}

pas besoin d'écrire des tuyaux.

Abhishek Ekaanth
la source
4
C'est une réponse incorrecte - la question demande de mettre en majuscule la première lettre de la chaîne, et non la première lettre de chaque mot.
Alex Peters
23

une meilleure façon

app.filter('capitalize', function() {
  return function(token) {
      return token.charAt(0).toUpperCase() + token.slice(1);
   }
});
Patrik Melander
la source
18

Si vous recherchez des performances, essayez d'éviter d'utiliser les filtres AngularJS car ils sont appliqués deux fois par expression pour vérifier leur stabilité.

Une meilleure façon serait d'utiliser un ::first-letterpseudo-élément CSS avec text-transform: uppercase;. Cela ne peut pas être utilisé sur des éléments en ligne tels que span, cependant, la meilleure chose à faire serait d'utilisertext-transform: capitalize; sur tout le bloc, qui met en majuscule chaque mot.

Exemple:

var app = angular.module('app', []);

app.controller('Ctrl', function ($scope) {
   $scope.msg = 'hello, world.';
});
.capitalize {
  display: inline-block;  
}

.capitalize::first-letter {
  text-transform: uppercase;
}

.capitalize2 {
  text-transform: capitalize;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">
    <div ng-controller="Ctrl">
        <b>My text:</b> <div class="capitalize">{{msg}}</div>
        <p><b>My text:</b> <span class="capitalize2">{{msg}}</span></p>
    </div>
</div>

Gregor Eesmaa
la source
1
Malheureusement, ::first-letterne fonctionne pas sur display: inlineou display: flex, uniquement sur display:blockou inline-blockéléments
jakub.g
18

J'aime la réponse de @TrampGuy

CSS est toujours (enfin, pas toujours) un meilleur choix, donc: text-transform: capitalize; est certainement la voie à suivre.

Mais que faire si votre contenu est tout en majuscules pour commencer? Si vous essayez un text-transform: capitalize;contenu comme "FOO BAR", vous obtiendrez toujours "FOO BAR" sur votre écran. Pour contourner ce problème, vous pouvez mettre le text-transform: capitalize;dans votre css, mais aussi minuscule votre chaîne, donc:

<ul>
  <li class="capitalize">{{ foo.awesome_property | lowercase }}</li>
</ul>

où nous utilisons la classe capitalize de @ TrampGuy:

.capitalize {
  text-transform: capitalize;
}

Donc, en prétendant que foo.awsome_propertycela afficherait normalement "FOO BAR", il imprimera maintenant le "Foo Bar" souhaité.

Ryan Crews
la source
14

si vous voulez mettre en majuscule chaque mot de la chaîne (en cours -> En cours), vous pouvez utiliser un tableau comme celui-ci.

.filter('capitalize', function() {
    return function(input) {
        return (!!input) ? input.split(' ').map(function(wrd){return wrd.charAt(0).toUpperCase() + wrd.substr(1).toLowerCase();}).join(' ') : '';
    }
});
Naveen raj
la source
11

C'est une autre façon:

{{some_str | limitTo:1 | uppercase}}{{some_str.substr(1) | lowercase }}
pallav deshmukh
la source
9

Pour Angular 2 et plus, vous pouvez utiliser {{ abc | titlecase }}.

Vérifiez l' API Angular.io pour la liste complète.

Windmaomao
la source
1
C'est une réponse incorrecte - la question demande de mettre en majuscule la première lettre de la chaîne, et non la première lettre de chaque mot.
Alex Peters
7

.capitalize {
  display: inline-block;
}

.capitalize:first-letter {
  font-size: 2em;
  text-transform: capitalize;
}
<span class="capitalize">
  really, once upon a time there was a badly formatted output coming from my backend, <strong>all completely in lowercase</strong> and thus not quite as fancy-looking as could be - but then cascading style sheets (which we all know are <a href="http://9gag.com/gag/6709/css-is-awesome">awesome</a>) with modern pseudo selectors came around to the rescue...
</span>

Philzen
la source
3

Pour AngularJS de meanjs.org, je place les filtres personnalisés dans modules/core/client/app/init.js

J'avais besoin d'un filtre personnalisé pour mettre en majuscule chaque mot d'une phrase, voici comment procéder:

angular.module(ApplicationConfiguration.applicationModuleName).filter('capitalize', function() {
return function(str) {
    return str.split(" ").map(function(input){return (!!input) ? input.charAt(0).toUpperCase() + input.substr(1).toLowerCase() :         ''}).join(" ");

}
});

Le mérite de la fonction de carte revient à @Naveen raj

Maxim Mai
la source
3

En angular 7+ qui a un tuyau intégré

{{ yourText | titlecase  }}
Ahmad Sharif
la source
2

Si vous ne souhaitez pas créer de filtre personnalisé, vous pouvez utiliser directement

{{ foo.awesome_property.substring(0,1) | uppercase}}{{foo.awesome_property.substring(1)}}
Chhitij Srivastava
la source
2
var app = angular.module("app", []);
app.filter('capitalize', function() {
    return function(str) {
        if (str === undefined) return; // avoid undefined
        str = str.toLowerCase().split(" ");
        var c = '';
        for (var i = 0; i <= (str.length - 1); i++) {
            var word = ' ';
            for (var j = 0; j < str[i].length; j++) {
                c = str[i][j];
                if (j === 0) {
                    c = c.toUpperCase();
                }
                word += c;
            }
            str[i] = word;
        }
        str = str.join('');
        return str;
    }
});
murali2486
la source
2
Bien que cet extrait de code puisse être la solution, inclure une explication contribue vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondez à la question aux lecteurs à l'avenir, et que ces personnes pourraient ne pas connaître les raisons de votre suggestion de code.
peacetype
1

Pour ajouter ma propre opinion sur cette question, j'utiliserais moi-même une directive personnalisée;

app.directive('capitalization', function () {
return {
    require: 'ngModel',
    link: function (scope, element, attrs, modelCtrl) {

        modelCtrl.$parsers.push(function (inputValue) {

            var transformedInput = (!!inputValue) ? inputValue.charAt(0).toUpperCase() + inputValue.substr(1).toLowerCase() : '';

            if (transformedInput != inputValue) {
                modelCtrl.$setViewValue(transformedInput);
                modelCtrl.$render();
            }

            return transformedInput;
        });
    }
};

Une fois déclaré, vous pouvez le placer dans votre Html comme ci-dessous;

<input ng-model="surname" ng-trim="false" capitalization>
uk2k05
la source
1

Au lieu de cela, si vous souhaitez mettre en majuscule chaque mot d'une phrase, vous pouvez utiliser ce code

app.filter('capitalize', function() {


return function(input, scope) {
if (input!=null)
input = input.toLowerCase().split(' ');

for (var i = 0; i < input.length; i++) {
   // You do not need to check if i is larger than input length, as your for does that for you
   // Assign it back to the array
   input[i] = input[i].charAt(0).toUpperCase() + input[i].substring(1);     


}
   // Directly return the joined string
   return input.join(' '); 
  }
});

et ajoutez simplement le filtre "capitalize" à votre entrée de chaîne, par exemple - {{nom | capitaliser}}

Akash Saxena
la source
0

dans Angular 4 ou CLI, vous pouvez créer un PIPE comme celui-ci:

import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
  name: 'capitalize'
})
/**
 * Place the first letter of each word in capital letters and the other in lower case. Ex: The LORO speaks = The Loro Speaks
 */
export class CapitalizePipe implements PipeTransform {
  transform(value: any): any {
    value = value.replace('  ', ' ');
    if (value) {
      let w = '';
      if (value.split(' ').length > 0) {
        value.split(' ').forEach(word => {
          w += word.charAt(0).toUpperCase() + word.toString().substr(1, word.length).toLowerCase() + ' '
        });
      } else {
        w = value.charAt(0).toUpperCase() + value.toString().substr(1, value.length).toLowerCase();
      }
      return w;
    }
    return value;
  }
}
eberlast
la source
0

Angular a 'titlecase' qui met en majuscule la première lettre d'une chaîne

Par exemple:

envName | titlecase

sera affiché comme EnvName

Lorsqu'il est utilisé avec l'interpolation, évitez tous les espaces comme

{{envName|titlecase}}

et la première lettre de valeur d'envName sera imprimée en majuscules.

Vedha Peri
la source
1
Cela ne donne aucune valeur à la réponse ci
Ivan Kaloyanov
1
C'est une réponse incorrecte - la question demande de mettre en majuscule la première lettre de la chaîne, et non la première lettre de chaque mot.
Alex Peters
0
if (value){
  value = (value.length > 1) ? value[0].toUpperCase() + value.substr(1).toLowerCase() : value.toUpperCase();
}
Ali
la source
-1

Vous pouvez ajouter une majuscule à l'exécution de la fonctionnalité comme suit:

<td>{{lastName.charAt(0).toUpperCase()+ lastName.substr(1).toLowerCase()}}</td>
Rahul Mankar
la source
-1

{{ uppercase_expression | capitaliseFirst}} devrait marcher

Hasan Shaik
la source
-2

Ajoutant à la réponse de Nidhish,

Pour les personnes que vous utilisez AngularJs et qui cherchent à mettre en majuscule la première lettre de chaque mot de la chaîne, utilisez le code ci-dessous:

var app = angular.module('app', []);

app.controller('Ctrl', function ($scope) {
   $scope.msg = 'hello, world.';
});

app.filter('titlecase', function() {
    return function(input) {
      //Check for valid string
      if(angular.isString(input) && input.length > 0) {
        var inputArray = input.split(' ');
        for(var i=0; i<inputArray.length; i++) {
          var value = inputArray[i];
          inputArray[i] =  value.charAt(0).toUpperCase() + value.substr(1).toLowerCase();
        }
        return inputArray.join(' ');
      } else {
        return input;
      }
    };
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">
    <div ng-controller="Ctrl">
        <p><b>My Text:</b> {{msg | titlecase}}</p>
    </div>
</div>

Pankaj
la source