I want to capitalize all words in an input (using keyup function) to format names entered.
examples :
john doe => John Doe
JOHN DOE => John Doe
tommy-lee => Tommy-Lee
Currently, I use this code :
$("input").keyup(function() {
var cp_value= ucwords($(this).val(),true) ;
$(this).val(cp_value );
});
function ucwords(str,force){
str=force ? str.toLowerCase() : str;
return str.replace(/(\b)([a-zA-Z])/g,
function(firstLetter){
return firstLetter.toUpperCase();
});
}
But if the word contains an accentuated character, the following letter is also uppercased : John Döe => John DöE.
What is the best solution to get what I want ?
Thank you
I want to capitalize all words in an input (using keyup function) to format names entered.
examples :
john doe => John Doe
JOHN DOE => John Doe
tommy-lee => Tommy-Lee
Currently, I use this code :
$("input").keyup(function() {
var cp_value= ucwords($(this).val(),true) ;
$(this).val(cp_value );
});
function ucwords(str,force){
str=force ? str.toLowerCase() : str;
return str.replace(/(\b)([a-zA-Z])/g,
function(firstLetter){
return firstLetter.toUpperCase();
});
}
But if the word contains an accentuated character, the following letter is also uppercased : John Döe => John DöE.
What is the best solution to get what I want ?
Thank you
Share Improve this question edited Oct 30, 2011 at 6:54 Charles 51.4k13 gold badges106 silver badges144 bronze badges asked Oct 24, 2011 at 11:03 user1010687user1010687 731 silver badge4 bronze badges 2- 1 It is not actually a jQuery problem as it is better solved using plain JS. See my answer below. – Lapple Commented Oct 24, 2011 at 12:38
-
str.split(/(\s|-)+/).map(function( v ,i ){ return v.charAt(0).toUpperCase()+ v.slice(1).toLowerCase(); }).join('')
– rab Commented Jun 18, 2014 at 15:09
3 Answers
Reset to default 9Problem is with the word boundary if you do a manual boundary it works
function ucwords(str,force){
str=force ? str.toLowerCase() : str;
return str.replace(/(^([a-zA-Z\p{M}]))|([ -][a-zA-Z\p{M}])/g,
function(firstLetter){
return firstLetter.toUpperCase();
});
}
and adding the Unicode for the accented characters as well
Use this one:
function ucwords(input) {
var words = input.split(/(\s|-)+/),
output = [];
for (var i = 0, len = words.length; i < len; i += 1) {
output.push(words[i][0].toUpperCase() +
words[i].toLowerCase().substr(1));
}
return output.join('');
}
Testing:
console.log(ucwords('JOHN DOE'),
ucwords('tommy-lee'),
ucwords('TOMMY-lee'),
ucwords('John Döe'));
you can do something like this after keyup split then get the fisrt char and uppercase it then join all. you can check this link i wrote a demo for you http://jsfiddle/vbx3x/5/
function ucwords(str,force){
str=force ? str.toLowerCase() : str;
var temp= str.split(/(\s|-)+/);
for(var i=0; i<temp.length; i++) {
temp[i] = temp[i].substr(0,1).toUpperCase() + temp[i].substr(1,temp[i].length-1)
}
return temp.join(' ');
}