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.

Piyush
fuente
1
Sí, tendrás que escribir un código. Angular no hará todo por ti. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… , developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
JB Nizet
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>

Nidhish Krishnan
fuente
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;)

Vagabundo
fuente
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.

minimalpop
fuente
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.

Abhishek Ekaanth
fuente
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);
   }
});
Patrik Melander
fuente
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>

Gregor Eesmaa
fuente
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".

Ryan Crews
fuente
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(' ') : '';
    }
});
Naveen raj
fuente
11

Esta es otra forma:

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

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

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

windmaomao
fuente
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>

Philzen
fuente
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

Maxim Mai
fuente
3

En angular 7+ que tiene tubería incorporada

{{ yourText | titlecase  }}
Ahmad Sharif
fuente
2

Si no desea crear un filtro personalizado, puede usarlo directamente

{{ foo.awesome_property.substring(0,1) | uppercase}}{{foo.awesome_property.substring(1)}}
Chhitij Srivastava
fuente
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
fuente
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>
uk2k05
fuente
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}}

Akash Saxena
fuente
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;
  }
}
eberlast
fuente
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.

Vedha Peri
fuente
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();
}
Ali
fuente
-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>
Rahul Mankar
fuente
-1

{{ uppercase_expression | capitaliseFirst}} Deberia trabajar

Hasan Shaik
fuente
-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>

Pankaj
fuente