I want capitalize first character of string in angularjs
As i used {{ uppercase_expression | uppercase}}
it convert whole string to upper case.
This question is related to
javascript
angularjs
filter
uppercase
capitalize
In angular 7+ which has built-in pipe
{{ yourText | titlecase }}
in Angular 4 or CLI you can create a PIPE like this:
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;
}
}
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;
}
});
You can try to split your String into two parts and manage their case separately.
{{ (Name.charAt(0) | uppercase) + "" + (Name.slice(1, element.length) | lowercase) }}
or
{{ Name.charAt(0) | uppercase }} {{ Name.slice(1, element.length) | lowercase }}
if you want capitalize each word from string (in progress -> In Progress), you can use array like this.
.filter('capitalize', function() {
return function(input) {
return (!!input) ? input.split(' ').map(function(wrd){return wrd.charAt(0).toUpperCase() + wrd.substr(1).toLowerCase();}).join(' ') : '';
}
});
{{ uppercase_expression | capitaliseFirst}}
should work
I'd say don't use angular/js as you can simply use css instead:
In your css, add the class:
.capitalize {
text-transform: capitalize;
}
Then, simply wrap the expression (for ex) in your html:
<span class="capitalize">{{ uppercase_expression }}</span>
No js needed ;)
If you don't want to build custom filter then you can use directly
{{ foo.awesome_property.substring(0,1) | uppercase}}{{foo.awesome_property.substring(1)}}
If you are using Angular 4+ then you can just use titlecase
{{toUppercase | titlecase}}
don't have to write any pipes.
For the AngularJS from meanjs.org, I place the custom filters in modules/core/client/app/init.js
I needed a custom filter to capitalize each word in a sentence, here is how I do so:
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(" ");
}
});
The credit of the map function goes to @Naveen raj
For Angular 2 and up, you can use {{ abc | titlecase }}
.
Check Angular.io API for complete list.
.capitalize {_x000D_
display: inline-block;_x000D_
}_x000D_
_x000D_
.capitalize:first-letter {_x000D_
font-size: 2em;_x000D_
text-transform: capitalize;_x000D_
}
_x000D_
<span class="capitalize">_x000D_
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..._x000D_
</span>
_x000D_
This is another way:
{{some_str | limitTo:1 | uppercase}}{{some_str.substr(1) | lowercase }}
Just to add my own take on this issue, I would use a custom directive myself;
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;
});
}
};
Once declared you can place inside your Html as below;
<input ng-model="surname" ng-trim="false" capitalization>
If you use Bootstrap, you can simply add the text-capitalize
helper class:
<p class="text-capitalize">CapiTaliZed text.</p>
EDIT: just in case the link dies again:
Text Transform
Transform text in components with text capitalization classes.
lowercased text.
UPPERCASED TEXT.
CapiTaliZed Text.<p class="text-lowercase">Lowercased text.</p> <p class="text-uppercase">Uppercased text.</p> <p class="text-capitalize">CapiTaliZed text.</p>
Note how text-capitalize only changes the first letter of each word, leaving the case of any other letters unaffected.
If you are after performance, try to avoid using AngularJS filters as they are applied twice per each expression to check for their stability.
A better way would be to use CSS ::first-letter
pseudo-element with text-transform: uppercase;
. That can't be used on inline elements such as span
, though, so the next best thing would be to use text-transform: capitalize;
on the whole block, which capitalizes every word.
Example:
var app = angular.module('app', []);_x000D_
_x000D_
app.controller('Ctrl', function ($scope) {_x000D_
$scope.msg = 'hello, world.';_x000D_
});
_x000D_
.capitalize {_x000D_
display: inline-block; _x000D_
}_x000D_
_x000D_
.capitalize::first-letter {_x000D_
text-transform: uppercase;_x000D_
}_x000D_
_x000D_
.capitalize2 {_x000D_
text-transform: capitalize;_x000D_
}
_x000D_
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>_x000D_
<div ng-app="app">_x000D_
<div ng-controller="Ctrl">_x000D_
<b>My text:</b> <div class="capitalize">{{msg}}</div>_x000D_
<p><b>My text:</b> <span class="capitalize2">{{msg}}</span></p>_x000D_
</div>_x000D_
</div>
_x000D_
if (value){
value = (value.length > 1) ? value[0].toUpperCase() + value.substr(1).toLowerCase() : value.toUpperCase();
}
Angular has 'titlecase' which capitalizes the first letter in a string
For ex:
envName | titlecase
will be displayed as EnvName
When used with interpolation, avoid all spaces like
{{envName|titlecase}}
and the first letter of value of envName will be printed in upper case.
You can add capitalize functionality run time as:
<td>{{lastName.charAt(0).toUpperCase()+ lastName.substr(1).toLowerCase()}}</td>
I like the answer from @TrampGuy
CSS is always (well, not always) a better choice, so: text-transform: capitalize;
is certainly the way to go.
But what if your content is all uppercase to begin with? If you try text-transform: capitalize;
on content like "FOO BAR" you'll still get "FOO BAR" in your display. To get around that issue you could put the text-transform: capitalize;
in your css, but also lowercase your string, so:
<ul>
<li class="capitalize">{{ foo.awesome_property | lowercase }}</li>
</ul>
where we are using @TrampGuy's capitalize class:
.capitalize {
text-transform: capitalize;
}
So, pretending that foo.awsome_property
would normally print "FOO BAR", it will now print the desired "Foo Bar".
Instead if you want to capitalize each word of a sentence then you can use this 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(' ');
}
});
and just add filter "capitalize" to your string input, for ex - {{name | capitalize}}
a nicer way
app.filter('capitalize', function() {
return function(token) {
return token.charAt(0).toUpperCase() + token.slice(1);
}
});
Source: Stackoverflow.com