Reputation: 5409
Is there a function built into Java that capitalizes the first character of each word in a String, and does not affect the others?
Examples:
jon skeet
-> Jon Skeet
miles o'Brien
-> Miles O'Brien
(B remains capital, this rules out Title Case)old mcdonald
-> Old Mcdonald
**(Old McDonald
would be find too, but I don't expect it to be THAT smart.)
A quick look at the Java String Documentation reveals only toUpperCase()
and toLowerCase()
, which of course do not provide the desired behavior. Naturally, Google results are dominated by those two functions. It seems like a wheel that must have been invented already, so it couldn't hurt to ask so I can use it in the future.
Upvotes: 474
Views: 551919
Reputation: 59950
you can use Matcher::replaceAll
like this :
public static void upperCaseAllFirstCharacter(String text) {
String regex = "\\b(.)(.*?)\\b";
String result = Pattern.compile(regex).matcher(text).replaceAll(
matche -> matche.group(1).toUpperCase() + matche.group(2)
);
System.out.println(result);
}
Example :
upperCaseAllFirstCharacter("hello this is Just a test");
Outputs
Hello This Is Just A Test
Upvotes: 10
Reputation: 1922
I noticed in previous answers that referred to apache common utils, they either used the class WordUtils
which is now deprecated, or they use StringUtils.capitalize()
which only capitalizes the first word but not every single word in the sentence.
Here is a pure java solution to do this. Note: this will not work if there is a bit of punctuation in front of the word. Here's the function capitalizeEachWord()
, but wrapped up in a main class so you can see a few basic tests cases.
import java.util.Optional;
import java.util.Objects;
class HelloWorld {
public static void main(String[] args) {
System.out.println(capitalizeEachWord(""));
System.out.println(capitalizeEachWord("."));
System.out.println(capitalizeEachWord(" ."));
System.out.println(capitalizeEachWord(" . "));
System.out.println(capitalizeEachWord("testing. 1 one 2 two 3 three"));
System.out.println(capitalizeEachWord("testing. 1 one 2 two 3 three."));
System.out.println(capitalizeEachWord("testing. 1 one 2 two 3 three "));
System.out.println(capitalizeEachWord("testing. 1 one 2 two 3 three. "));
System.out.println(capitalizeEachWord(" testing. 1 one 2 two 3 three"));
System.out.println(capitalizeEachWord("!testing. 1 one 2 two 3 three."));
System.out.println(capitalizeEachWord(" !testing. 1 one 2 two 3 three "));
System.out.println(capitalizeEachWord(" !testing. 1 one 2 two 3 three "));
System.out.println(capitalizeEachWord(" !testing. 1 one 2 two 3 three 4"));
}
private static String capitalizeEachWord(final String line) {
return Optional.ofNullable(line)
.filter(Objects::nonNull)
.filter(givenLine -> givenLine.length() > 0)
.map(givenLine -> {
StringBuilder sb = new StringBuilder(givenLine);
if(sb.charAt(0) != ' ') {
sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
}
for (int i = 1; i < sb.length(); i++) {
if (sb.charAt(i - 1) == ' ') {
sb.setCharAt(i, Character.toUpperCase(sb.charAt(i)));
}
}
return sb.toString();
})
.orElse(line);
}
}
resulting output:
.
.
.
Testing. 1 One 2 Two 3 Three
Testing. 1 One 2 Two 3 Three.
Testing. 1 One 2 Two 3 Three
Testing. 1 One 2 Two 3 Three.
Testing. 1 One 2 Two 3 Three
!testing. 1 One 2 Two 3 Three.
!testing. 1 One 2 Two 3 Three
!testing. 1 One 2 Two 3 Three
!testing. 1 One 2 Two 3 Three 4
Upvotes: 0
Reputation: 596996
WordUtils.capitalize(str)
(from apache commons-text)
(Note: if you need "fOO BAr"
to become "Foo Bar"
, then use capitalizeFully(..)
instead)
Upvotes: 799
Reputation: 112
You can also do it very simply like this and preserve any doubled and leading, trailing whitespaces
public static String capitalizeWords(String text) {
StringBuilder sb = new StringBuilder();
if(text.length()>0){
sb.append(Character.toUpperCase(text.charAt(0)));
}
for (int i=1; i<text.length(); i++){
String chPrev = String.valueOf(text.charAt(i-1));
String ch = String.valueOf(text.charAt(i));
if(Objects.equals(chPrev, " ")){
sb.append(ch.toUpperCase());
}else {
sb.append(ch);
}
}
return sb.toString();
}
Upvotes: 0
Reputation: 2913
public static String capitalizeAll(String str) {
if (str == null || str.isEmpty()) {
return str;
}
return Arrays.stream(str.split("\\s+"))
.map(t -> t.substring(0, 1).toUpperCase() + t.substring(1))
.collect(Collectors.joining(" "));
}
Examples:
System.out.println(capitalizeAll("jon skeet")); // Jon Skeet
System.out.println(capitalizeAll("miles o'Brien")); // Miles O'Brien
System.out.println(capitalizeAll("old mcdonald")); // Old Mcdonald
System.out.println(capitalizeAll(null)); // null
For foo bAR
to Foo Bar
, replace the map()
method with the following:
.map(t -> t.substring(0, 1).toUpperCase() + t.substring(1).toLowerCase())
String.replaceAll()
(Java 9+)ublic static String capitalizeAll(String str) {
if (str == null || str.isEmpty()) {
return str;
}
return Pattern.compile("\\b(.)(.*?)\\b")
.matcher(str)
.replaceAll(match -> match.group(1).toUpperCase() + match.group(2));
}
Examples:
System.out.println(capitalizeAll("12 ways to learn java")); // 12 Ways To Learn Java
System.out.println(capitalizeAll("i am atta")); // I Am Atta
System.out.println(capitalizeAll(null)); // null
System.out.println(WordUtils.capitalize("love is everywhere")); // Love Is Everywhere
System.out.println(WordUtils.capitalize("sky, sky, blue sky!")); // Sky, Sky, Blue Sky!
System.out.println(WordUtils.capitalize(null)); // null
For titlecase:
System.out.println(WordUtils.capitalizeFully("fOO bAR")); // Foo Bar
System.out.println(WordUtils.capitalizeFully("sKy is BLUE!")); // Sky Is Blue!
For details, checkout this tutorial.
Upvotes: 6
Reputation: 1
Heres a lil program I was using to capitalize each first letter word in every subfolder of a parent directory.
private void capitalize(String string)
{
List<String> delimiters = new ArrayList<>();
delimiters.add(" ");
delimiters.add("_");
File folder = new File(string);
String name = folder.getName();
String[] characters = name.split("");
String newName = "";
boolean capitalizeNext = false;
for (int i = 0; i < characters.length; i++)
{
String character = characters[i];
if (capitalizeNext || i == 0)
{
newName += character.toUpperCase();
capitalizeNext = false;
}
else
{
if (delimiters.contains(character)) capitalizeNext = true;
newName += character;
}
}
folder.renameTo(new File(folder.getParent() + File.separator + newName));
}
Upvotes: 0
Reputation: 1
public static void main(String[] args) throws IOException {
String words = "this is a test";
System.out.println(Arrays.asList(words.split(" ")).stream().reduce("",(a, b)->(a + " " + b.substring(0, 1).toUpperCase() + b.substring(1))));
}
}
Upvotes: 0
Reputation: 223
I just want to add an alternative solution for the problem by using only Java code. No extra library
public String Capitalize(String str) {
String tt = "";
String tempString = "";
String tempName = str.trim().toLowerCase();
String[] tempNameArr = tempName.split(" ");
System.out.println("The size is " + tempNameArr.length);
if (tempNameArr.length > 1) {
for (String t : tempNameArr) {
tt += Capitalize(t);
tt += " ";
}
tempString = tt;
} else {
tempString = tempName.replaceFirst(String.valueOf(tempName.charAt(0)), String.valueOf(tempName.charAt(0)).toUpperCase());
}
return tempString.trim();
}
Upvotes: 0
Reputation: 91
Here we go for perfect first char capitalization of word
public static void main(String[] args) {
String input ="my name is ranjan";
String[] inputArr = input.split(" ");
for(String word : inputArr) {
System.out.println(word.substring(0, 1).toUpperCase()+word.substring(1,word.length()));
}
}
}
//Output : My Name Is Ranjan
Upvotes: 4
Reputation: 2268
Here is the Kotlin version of the same problem:
fun capitalizeFirstLetterOfEveryWord(text: String): String
{
if (text.isEmpty() || text.isBlank())
{
return ""
}
if (text.length == 1)
{
return Character.toUpperCase(text[0]).toString()
}
val textArray = text.split(" ")
val stringBuilder = StringBuilder()
for ((index, item) in textArray.withIndex())
{
// If item is empty string, continue to next item
if (item.isEmpty())
{
continue
}
stringBuilder
.append(Character.toUpperCase(item[0]))
// If the item has only one character then continue to next item because we have already capitalized it.
if (item.length == 1)
{
continue
}
for (i in 1 until item.length)
{
stringBuilder
.append(Character.toLowerCase(item[i]))
}
if (index < textArray.lastIndex)
{
stringBuilder
.append(" ")
}
}
return stringBuilder.toString()
}
Upvotes: 1
Reputation: 1
I made this little class that can be used to capitilize each word in a sentence. You can change the word separator in the string if this is not a space.
package com.ecnews.ecnews_v01.Helpers;
public class Capitalize {
String sentence;
String separator = " ";
public Capitalize(String sentence) {
this.sentence = sentence;
}
public void setSeparator(String separator) {
this.separator = separator;
}
public String getCapitalized() {
StringBuilder capitalized = new StringBuilder("");
for (String word : sentence.split(separator)) {
capitalized.append(separator+Character.toUpperCase(word.charAt(0)) + word.substring(1));
}
return capitalized.toString().trim();
}
}
Example:
String sourceName = new Capitalize("this is a test").getCapitalized();
sourceName will be "This Is A Test"
Upvotes: 0
Reputation: 172
this is another way i did
StringBuilder str=new StringBuilder("pirai sudie test test");
str.setCharAt(0,Character.toUpperCase(str.charAt(0)));
for(int i=str.length()-1;i>=0;i--)
{
if(Character.isSpaceChar(str.charAt(i)))
str.setCharAt(i+1,Character.toUpperCase(str.charAt(i+1)));
}
System.out.println(str);
Upvotes: 0
Reputation: 41
public static String toTitleCase(String word){
return Character.toUpperCase(word.charAt(0)) + word.substring(1);
}
public static void main(String[] args){
String phrase = "this is to be title cased";
String[] splitPhrase = phrase.split(" ");
String result = "";
for(String word: splitPhrase){
result += toTitleCase(word) + " ";
}
System.out.println(result.trim());
}
Upvotes: 4
Reputation: 5335
Here is RxJava
solution to the problem
String title = "this is a title";
StringBuilder stringBuilder = new StringBuilder();
Observable.fromArray(title.trim().split("\\s"))
.map(word -> word.substring(0, 1).toUpperCase() + word.substring(1).toLowerCase())
.toList()
.map(wordList -> {
for (String word : wordList) {
stringBuilder.append(word).append(" ");
}
return stringBuilder.toString();
})
.subscribe(result -> System.out.println(result));
I don't yet like the for loop inside map though.
Upvotes: 0
Reputation: 1800
String text="hello";
StringBuffer sb=new StringBuffer();
char[] ch=text.toCharArray();
for(int i=0;i<ch.length;i++){
if(i==0){
sb.append(Character.toUpperCase(ch[i]));
}
else{
sb.append(ch[i]);
}
}
text=sb.toString();
System.out.println(text);
}
Upvotes: 0
Reputation: 1
s.toLowerCase().trim();
result += Character.toUpperCase(s.charAt(0));
result += s.substring(1, s.indexOf(" ") + 1);
s = s.substring(s.indexOf(" ") + 1);
do {
if (s.contains(" ")) {
result += " ";
result += Character.toUpperCase(s.charAt(0));
result += s.substring(1, s.indexOf(" "));
s = s.substring(s.indexOf(" ") + 1);
} else {
result += " ";
result += Character.toUpperCase(s.charAt(0));
result += s.substring(1);
break;
}
} while (true);
System.out.println(result);
Upvotes: 0
Reputation: 224
I'm using the following function. I think it is faster in performance.
public static String capitalize(String text){
String c = (text != null)? text.trim() : "";
String[] words = c.split(" ");
String result = "";
for(String w : words){
result += (w.length() > 1? w.substring(0, 1).toUpperCase(Locale.US) + w.substring(1, w.length()).toLowerCase(Locale.US) : w) + " ";
}
return result.trim();
}
Upvotes: 6
Reputation: 11
The most basic and easiest way to understand (I think):
import java.util.Scanner;
public class ToUpperCase {
static Scanner kb = new Scanner(System.in);
public static String capitalize(String str){
/* Changes 1st letter of every word
in a string to upper case
*/
String[] ss = str.split(" ");
StringBuilder[] sb = new StringBuilder[ss.length];
StringBuilder capped = new StringBuilder("");
str = "";
// Capitalise letters
for (int i = 0; i < ss.length; i++){
sb[i] = new StringBuilder(ss[i]); // Construct and assign
str += Character.toUpperCase(ss[i].charAt(0)); // Only caps
//======================================================//
// Replace 1st letters with cap letters
sb[i].setCharAt(0, str.charAt(i));
capped.append(sb[i].toString() + " "); // Formatting
}
return capped.toString();
}
public static void main(String[] args){
System.out.println(capitalize(kb.nextLine()));
}
}
Upvotes: 0
Reputation: 431
Using org.apache.commons.lang.StringUtils
makes it very simple.
capitalizeStr = StringUtils.capitalize(str);
Upvotes: 10
Reputation: 2737
Try this:
private String capitalizer(String word){
String[] words = word.split(" ");
StringBuilder sb = new StringBuilder();
if (words[0].length() > 0) {
sb.append(Character.toUpperCase(words[0].charAt(0)) + words[0].subSequence(1, words[0].length()).toString().toLowerCase());
for (int i = 1; i < words.length; i++) {
sb.append(" ");
sb.append(Character.toUpperCase(words[i].charAt(0)) + words[i].subSequence(1, words[i].length()).toString().toLowerCase());
}
}
return sb.toString();
}
Upvotes: 1
Reputation: 221
I made a solution in Java 8 that is IMHO more readable.
public String firstLetterCapitalWithSingleSpace(final String words) {
return Stream.of(words.trim().split("\\s"))
.filter(word -> word.length() > 0)
.map(word -> word.substring(0, 1).toUpperCase() + word.substring(1))
.collect(Collectors.joining(" "));
}
The Gist for this solution can be found here: https://gist.github.com/Hylke1982/166a792313c5e2df9d31
Upvotes: 21
Reputation: 1280
Here is my solution.
I ran across this problem tonight and decided to search it. I found an answer by Neelam Singh that was almost there, so I decided to fix the issue (broke on empty strings) and caused a system crash.
The method you are looking for is named capString(String s)
below.
It turns "It's only 5am here" into "It's Only 5am Here".
The code is pretty well commented, so enjoy.
package com.lincolnwdaniel.interactivestory.model;
public class StringS {
/**
* @param s is a string of any length, ideally only one word
* @return a capitalized string.
* only the first letter of the string is made to uppercase
*/
public static String capSingleWord(String s) {
if(s.isEmpty() || s.length()<2) {
return Character.toUpperCase(s.charAt(0))+"";
}
else {
return Character.toUpperCase(s.charAt(0)) + s.substring(1);
}
}
/**
*
* @param s is a string of any length
* @return a title cased string.
* All first letter of each word is made to uppercase
*/
public static String capString(String s) {
// Check if the string is empty, if it is, return it immediately
if(s.isEmpty()){
return s;
}
// Split string on space and create array of words
String[] arr = s.split(" ");
// Create a string buffer to hold the new capitalized string
StringBuffer sb = new StringBuffer();
// Check if the array is empty (would be caused by the passage of s as an empty string [i.g "" or " "],
// If it is, return the original string immediately
if( arr.length < 1 ){
return s;
}
for (int i = 0; i < arr.length; i++) {
sb.append(Character.toUpperCase(arr[i].charAt(0)))
.append(arr[i].substring(1)).append(" ");
}
return sb.toString().trim();
}
}
Upvotes: 2
Reputation: 31
There are many way to convert the first letter of the first word being capitalized. I have an idea. It's very simple:
public String capitalize(String str){
/* The first thing we do is remove whitespace from string */
String c = str.replaceAll("\\s+", " ");
String s = c.trim();
String l = "";
for(int i = 0; i < s.length(); i++){
if(i == 0){ /* Uppercase the first letter in strings */
l += s.toUpperCase().charAt(i);
i++; /* To i = i + 1 because we don't need to add
value i = 0 into string l */
}
l += s.charAt(i);
if(s.charAt(i) == 32){ /* If we meet whitespace (32 in ASCII Code is whitespace) */
l += s.toUpperCase().charAt(i+1); /* Uppercase the letter after whitespace */
i++; /* Yo i = i + 1 because we don't need to add
value whitespace into string l */
}
}
return l;
}
Upvotes: 3
Reputation: 13716
Reusable method for intiCap:
public class YarlagaddaSireeshTest{
public static void main(String[] args) {
String FinalStringIs = "";
String testNames = "sireesh yarlagadda test";
String[] name = testNames.split("\\s");
for(String nameIs :name){
FinalStringIs += getIntiCapString(nameIs) + ",";
}
System.out.println("Final Result "+ FinalStringIs);
}
public static String getIntiCapString(String param) {
if(param != null && param.length()>0){
char[] charArray = param.toCharArray();
charArray[0] = Character.toUpperCase(charArray[0]);
return new String(charArray);
}
else {
return "";
}
}
}
Upvotes: 2
Reputation: 21
This one works for the surname case...
With different types of separators, and it keeps the same separator:
jean-frederic --> Jean-Frederic
jean frederic --> Jean Frederic
The code works with the GWT client side.
public static String capitalize (String givenString) {
String Separateur = " ,.-;";
StringBuffer sb = new StringBuffer();
boolean ToCap = true;
for (int i = 0; i < givenString.length(); i++) {
if (ToCap)
sb.append(Character.toUpperCase(givenString.charAt(i)));
else
sb.append(Character.toLowerCase(givenString.charAt(i)));
if (Separateur.indexOf(givenString.charAt(i)) >=0)
ToCap = true;
else
ToCap = false;
}
return sb.toString().trim();
}
Upvotes: 1
Reputation: 7713
The short and precise way is as follows:
String name = "test";
name = (name.length() != 0) ?name.toString().toLowerCase().substring(0,1).toUpperCase().concat(name.substring(1)): name;
-------------------- Output -------------------- Test T empty --------------------
It works without error if you try and change the name value to the three of values. Error free.
Upvotes: 1
Reputation: 2943
This is just another way of doing it:
private String capitalize(String line)
{
StringTokenizer token =new StringTokenizer(line);
String CapLine="";
while(token.hasMoreTokens())
{
String tok = token.nextToken().toString();
CapLine += Character.toUpperCase(tok.charAt(0))+ tok.substring(1)+" ";
}
return CapLine.substring(0,CapLine.length()-1);
}
Upvotes: 2
Reputation: 2482
Use:
String text = "jon skeet, miles o'brien, old mcdonald";
Pattern pattern = Pattern.compile("\\b([a-z])([\\w]*)");
Matcher matcher = pattern.matcher(text);
StringBuffer buffer = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(buffer, matcher.group(1).toUpperCase() + matcher.group(2));
}
String capitalized = matcher.appendTail(buffer).toString();
System.out.println(capitalized);
Upvotes: 3
Reputation: 1
public void capitaliseFirstLetterOfEachWord()
{
String value="this will capitalise first character of each word of this string";
String[] wordSplit=value.split(" ");
StringBuilder sb=new StringBuilder();
for (int i=0;i<wordSplit.length;i++){
sb.append(wordSplit[i].substring(0,1).toUpperCase().
concat(wordSplit[i].substring(1)).concat(" "));
}
System.out.println(sb);
}
Upvotes: 0
Reputation: 2986
I use wordUppercase(String s)
from the Raindrop-Library.
Because this is my library, here the single method:
/**
* Set set first letter from every word uppercase.
*
* @param s - The String wich you want to convert.
* @return The string where is the first letter of every word uppercase.
*/
public static String wordUppercase(String s){
String[] words = s.split(" ");
for (int i = 0; i < words.length; i++) words[i] = words[i].substring(0, 1).toUpperCase() + words[i].substring(1).toLowerCase();
return String.join(" ", words);
}
Hope it helps :)
Upvotes: 0