Poner en mayúscula la primera letra de cadena en AngularJs


134

Quiero capitalizar el primer carácter de la cadena en angularjs

Como lo usé {{ uppercase_expression | uppercase}}, convertí toda la cadena a mayúsculas.



11
Esto se puede hacer usando CSS también. Echa un vistazo a la transformación de texto: capitalizar propiedad
Ramanathan Muthuraman

1
Puede usar esta solución si realmente quiere usar angular: codepen.io/WinterJoey/pen/sfFaK
Yousef_Shamshoum

1
cree una directiva / filtro simple que haga mayúscula la primera letra de la palabra para usted ...
Pankaj Parkar

Respuestas:


234

usa este filtro de mayúsculas

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>


11
Obtiene un error si desea capitalizar un número accidentalmente. El cuerpo de la función debe ser la siguiente: return (angular.isString(s) && s.length > 0) ? s[0].toUpperCase() + s.substr(1).toLowerCase() : s;. Si no es una cadena, devuélvala sin cambios.
Jabba

2
Aquí está escrito el código de
Michal

148

Yo diría que no use angular / js, ya que simplemente puede usar css en su lugar:

En su CSS, agregue la clase:

.capitalize {
   text-transform: capitalize;
}

Luego, simplemente envuelva la expresión (por ej.) En su html:

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

No se necesita js;)


77
Esta transformación capitalizará la primera letra de cada palabra, por lo que solo es aplicable a cadenas de una palabra
jakub.g

22
@ jakub.g Si solo quiere poner en mayúscula la primera palabra (bueno, letra), simplemente explique el selector css con el selector de :first-letterpseudoelementos. ¿Algo más dejado al descubierto? :)
Philzen

2
@Philzen ¡Sí! ¿Cómo lo harías solo con html? ;-)
Romain Vincent

@RomainVincent ¿Qué quieres decir con "solo HTML"? Tal vez mi respuesta a continuación ayude (simplemente haga clic en "Ejecutar fragmento de código" para verlo en acción). El contenido HTML es estático, al menos necesitará incluir CSS o JS para modificar su estilo, respectivamente, el contenido DOM.
Philzen

44
Lo siento, fue un mal intento de hacer una broma.
Romain Vincent

57

Si usa Bootstrap , simplemente puede agregar la text-capitalizeclase auxiliar:

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

EDITAR: en caso de que el enlace vuelva a morir:

Transformación de texto

Transformar texto en componentes con clases de mayúsculas de texto.

texto en minúscula
TEXTO MAYOR
Texto CapiTaliZed.

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

Observe cómo el uso de mayúsculas y minúsculas solo cambia la primera letra de cada palabra, sin afectar el caso de otras letras.


Manera rápida y fácil de lograr el objetivo, también esto pone en mayúscula la primera letra de cada palabra en la cadena, lo cual es genial.
kisanme

detrás de escena esto solo está usandotext-transform: capitalize;
cameck

27

Si está usando Angular 4+, entonces puede usar titlecase

{{toUppercase | titlecase}}

No tienes que escribir ninguna pipa.


44
Esta es una respuesta incorrecta: la pregunta pide poner en mayúscula la primera letra de la cadena, no la primera letra de cada palabra.
Alex Peters el

23

una mejor manera

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

18

Si busca rendimiento, trate de evitar el uso de filtros AngularJS ya que se aplican dos veces por cada expresión para verificar su estabilidad.

Una mejor manera sería usar el ::first-letterpseudo-elemento CSS con text-transform: uppercase;. Sin spanembargo, eso no se puede usar en elementos en línea , por lo que lo mejor sería usarlo text-transform: capitalize;en todo el bloque, que capitaliza cada palabra.

Ejemplo:

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>


1
Desafortunadamente ::first-letterno funciona en display: inlineo display: flex, solo en display:blocko inline-blockelementos
jakub.g

18

Me gusta la respuesta de @TrampGuy

CSS es siempre (bueno, no siempre) una mejor opción, por lo que text-transform: capitalize;es el camino a seguir.

Pero, ¿qué pasa si su contenido es todo en mayúsculas para empezar? Si prueba text-transform: capitalize;contenido como "FOO BAR", todavía obtendrá "FOO BAR" en su pantalla. Para evitar ese problema, puede poner el text-transform: capitalize;en su CSS, pero también en minúscula su cadena, por lo que:

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

donde estamos usando la clase de capitalización de @ TrampGuy:

.capitalize {
  text-transform: capitalize;
}

Entonces, pretendiendo que foo.awsome_propertynormalmente imprimiría "FOO BAR", ahora imprimirá la deseada "Foo Bar".


14

si desea poner en mayúscula cada palabra de la cadena (en progreso -> En progreso), puede usar una matriz como esta.

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

11

Esta es otra forma:

{{some_str | limitTo:1 | uppercase}}{{some_str.substr(1) | lowercase }}

9

Para Angular 2 y superior, puede usar {{ abc | titlecase }}.

Consulte la API de Angular.io para obtener una lista completa.


1
Esta es una respuesta incorrecta: la pregunta pide poner en mayúscula la primera letra de la cadena, no la primera letra de cada palabra.
Alex Peters el

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>


3

Para AngularJS de meanjs.org, coloco los filtros personalizados en modules/core/client/app/init.js

Necesitaba un filtro personalizado para capitalizar cada palabra en una oración, así es como lo hago:

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(" ");

}
});

El crédito de la función de mapa va a @Naveen raj



2

Si no desea crear un filtro personalizado, puede usarlo directamente

{{ foo.awesome_property.substring(0,1) | uppercase}}{{foo.awesome_property.substring(1)}}

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;
    }
});

2
Si bien este fragmento de código puede ser la solución, incluir una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para los lectores en el futuro, y que esas personas podrían no conocer los motivos de su sugerencia de código.
paz

1

Solo para agregar mi propia opinión sobre este tema, yo mismo usaría una directiva personalizada;

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;
        });
    }
};

Una vez declarado, puede colocarlo dentro de su Html como se muestra a continuación;

<input ng-model="surname" ng-trim="false" capitalization>

1

En cambio, si desea poner en mayúscula cada palabra de una oración, puede usar este código

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(' '); 
  }
});

y simplemente agregue el filtro "capitalizar" a su entrada de cadena, por ejemplo - {{name | capitalizar}}


0

en Angular 4 o CLI puede crear un TUBO como este:

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;
  }
}

0

Angular tiene 'titlecase' que escribe en mayúscula la primera letra de una cadena

Por ejemplo:

envName | titlecase

se mostrará como EnvName

Cuando se usa con interpolación, evite todos los espacios como

{{envName|titlecase}}

y la primera letra de valor de envName se imprimirá en mayúscula.


1
Esto no proporciona ningún valor a la respuesta anterior
Ivan Kaloyanov

1
Esta es una respuesta incorrecta: la pregunta pide poner en mayúscula la primera letra de la cadena, no la primera letra de cada palabra.
Alex Peters el

0
if (value){
  value = (value.length > 1) ? value[0].toUpperCase() + value.substr(1).toLowerCase() : value.toUpperCase();
}

-1

Puede agregar el tiempo de ejecución de la funcionalidad de mayúsculas como:

<td>{{lastName.charAt(0).toUpperCase()+ lastName.substr(1).toLowerCase()}}</td>


-2

Agregando a la respuesta de Nidhish,

Para las personas que está utilizando AngularJs y que buscan capitalizar la primera letra de cada palabra en la cadena, use el siguiente código:

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>

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.