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.