How do I format a string to title case?
20 Answers
Here is a simple static method to do this in C#:
public static string ToTitleCaseInvariant(string targetString)
{
return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(targetString);
}

- 82,117
- 31
- 79
- 106
-
2Not available in silverlight. See other C# answer(s) – Simon_Weaver Jun 09 '10 at 04:22
-
13If that isn't the longest qualification ever... `Throw.In.Todays.News.While.Youre.At.It(...);` – Thanatos Jun 09 '10 at 04:27
-
2Though be aware that if the starting string is all upper case, you have to call `String.ToLower` first, since `ToTitleCase` doesn't work on all upper case strings. – Hans Olsson Dec 13 '10 at 09:47
-
1How is it invariant if you're using the current culture? – Matthew Flaschen Nov 21 '11 at 01:01
I would be wary of automatically upcasing all whitespace-preceded-words in scenarios where I would run the risk of attracting the fury of nitpickers.
I would at least consider implementing a dictionary for exception cases like articles and conjunctions. Behold:
"Beauty and the Beast"
And when it comes to proper nouns, the thing gets much uglier.

- 14,138
- 9
- 71
- 83
Here's a Perl solution http://daringfireball.net/2008/05/title_case
Here's a Ruby solution http://frankschmitt.org/projects/title-case
Here's a Ruby one-liner solution: http://snippets.dzone.com/posts/show/4702
'some string here'.gsub(/\b\w/){$&.upcase}
What the one-liner is doing is using a regular expression substitution of the first character of each word with the uppercase version of it.

- 129,424
- 31
- 207
- 592

- 2,791
- 3
- 20
- 24
To capatilise it in, say, C - use the ascii codes (http://www.asciitable.com/) to find the integer value of the char and subtract 32 from it.
This is a poor solution if you ever plan to accept characters beyond a-z and A-Z.
For instance: ASCII 134: å, ASCII 143: Å.
Using arithmetic gets you: ASCII 102: f
Use library calls, don't assume you can use integer arithmetic on your characters to get back something useful. Unicode is tricky.

- 14,257
- 4
- 43
- 55
In Silverlight there is no ToTitleCase
in the TextInfo
class.
Here's a simple regex based way.
Note: Silverlight doesn't have precompiled regexes, but for me this performance loss is not an issue.
public string TitleCase(string str)
{
return Regex.Replace(str, @"\w+", (m) =>
{
string tmp = m.Value;
return char.ToUpper(tmp[0]) + tmp.Substring(1, tmp.Length - 1).ToLower();
});
}

- 140,023
- 84
- 646
- 689
-
This is excellent! Finally something "simple" that I can use in LightSwitch. However, one small nitpick. This is actually Proper Case, not Title Case. Can you think of an easy way to get it to exempt things like "a", "the" etc? Proper Case: This Is A Test Sentence Title Case: This is a Test Sentence – Yann Duran Aug 24 '11 at 04:54
-
In Perl:
$string =~ s/(\w+)/\u\L$1/g;
That's even in the FAQ.

- 39,428
- 4
- 43
- 70
-
It's not in the FAQ anymore because it's wrong. Think about what that does to contractions :) – brian d foy Oct 06 '08 at 01:16
In Java, you can use the following code.
public String titleCase(String str) {
char[] chars = str.toCharArray();
for (int i = 0; i < chars.length; i++) {
if (i == 0) {
chars[i] = Character.toUpperCase(chars[i]);
} else if ((i + 1) < chars.length && chars[i] == ' ') {
chars[i + 1] = Character.toUpperCase(chars[i + 1]);
}
}
return new String(chars);
}

- 575
- 5
- 17
If the language you are using has a supported method/function then just use that (as in the C# ToTitleCase
method)
If it does not, then you will want to do something like the following:
- Read in the string
- Take the first word
- Capitalize the first letter of that word 1
- Go forward and find the next word
- Go to 3 if not at the end of the string, otherwise exit
1 To capitalize it in, say, C - use the ascii codes to find the integer value of the char and subtract 32 from it.
There would need to be much more error checking in the code (ensuring valid letters etc.), and the "Capitalize" function will need to impose some sort of "title-case scheme" on the letters to check for words that do not need to be capatilised ('and', 'but' etc. Here is a good scheme)

- 169,610
- 28
- 168
- 175

- 47,588
- 14
- 53
- 53
-
Totally doesn't work on code tables like e.g. German where the umlauts (äöü) have upper case letters that don't follow that pattern. – xmjx Sep 29 '08 at 22:53
Excel-like PROPER:
public static string ExcelProper(string s) {
bool upper_needed = true;
string result = "";
foreach (char c in s) {
bool is_letter = Char.IsLetter(c);
if (is_letter)
if (upper_needed)
result += Char.ToUpper(c);
else
result += Char.ToLower(c);
else
result += c;
upper_needed = !is_letter;
}
return result;
}

- 88,222
- 31
- 159
- 162

- 41
- 2
Here's an implementation in Python: https://launchpad.net/titlecase.py
And a port of this implementation that I've just done in C++: http://codepad.org/RrfcsZzO

- 6,911
- 3
- 42
- 59
I think using the CultureInfo is not always reliable, this the simple and handy way to manipulate string manually:
string sourceName = txtTextBox.Text.ToLower();
string destinationName = sourceName[0].ToUpper();
for (int i = 0; i < (sourceName.Length - 1); i++) {
if (sourceName[i + 1] == "") {
destinationName += sourceName[i + 1];
}
else {
destinationName += sourceName[i + 1];
}
}
txtTextBox.Text = desinationName;

- 18,769
- 10
- 104
- 133

- 11
- 1
There is a built-in formula PROPER(n)
in Excel.
Was quite pleased to see I didn't have to write it myself!

- 140,023
- 84
- 646
- 689
Here is a simple example of how to do it :
public static string ToTitleCaseInvariant(string str)
{
return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(str);
}

- 43
- 7
In C#
using System.Globalization;
using System.Threading;
protected void Page_Load(object sender, EventArgs e)
{
CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
TextInfo textInfo = cultureInfo.TextInfo;
Response.Write(textInfo.ToTitleCase("WelcometoHome<br />"));
Response.Write(textInfo.ToTitleCase("Welcome to Home"));
Response.Write(textInfo.ToTitleCase("Welcome@to$home<br/>").Replace("@","").Replace("$", ""));
}

- 1,884
- 1
- 22
- 29
In C# you can simply use
CultureInfo.InvariantCulture.TextInfo.ToTitleCase(str.ToLowerInvariant())
- Invariant
- Works with uppercase strings
Here you have a C++ version. It's got a set of non uppercaseable words like prononuns and prepositions. However, I would not recommend automating this process if you are to deal with important texts.
#include <iostream>
#include <string>
#include <vector>
#include <cctype>
#include <set>
using namespace std;
typedef vector<pair<string, int> > subDivision;
set<string> nonUpperCaseAble;
subDivision split(string & cadena, string delim = " "){
subDivision retorno;
int pos, inic = 0;
while((pos = cadena.find_first_of(delim, inic)) != cadena.npos){
if(pos-inic > 0){
retorno.push_back(make_pair(cadena.substr(inic, pos-inic), inic));
}
inic = pos+1;
}
if(inic != cadena.length()){
retorno.push_back(make_pair(cadena.substr(inic, cadena.length() - inic), inic));
}
return retorno;
}
string firstUpper (string & pal){
pal[0] = toupper(pal[0]);
return pal;
}
int main()
{
nonUpperCaseAble.insert("the");
nonUpperCaseAble.insert("of");
nonUpperCaseAble.insert("in");
// ...
string linea, resultado;
cout << "Type the line you want to convert: " << endl;
getline(cin, linea);
subDivision trozos = split(linea);
for(int i = 0; i < trozos.size(); i++){
if(trozos[i].second == 0)
{
resultado += firstUpper(trozos[i].first);
}
else if (linea[trozos[i].second-1] == ' ')
{
if(nonUpperCaseAble.find(trozos[i].first) == nonUpperCaseAble.end())
{
resultado += " " + firstUpper(trozos[i].first);
}else{
resultado += " " + trozos[i].first;
}
}
else
{
resultado += trozos[i].first;
}
}
cout << resultado << endl;
getchar();
return 0;
}
With perl you could do this:
my $tc_string = join ' ', map { ucfirst($\_) } split /\s+/, $string;

- 169,610
- 28
- 168
- 175

- 89
- 1
- 5
-
This doesn't do title case, where small words (articles and prepositions) should not be capitalized. – brian d foy Oct 06 '08 at 01:18
Without using a ready-made function, a super-simple low-level algorithm to convert a string to title case:
convert first character to uppercase.
for each character in string,
if the previous character is whitespace,
convert character to uppercase.
This asssumes the "convert character to uppercase" will do that correctly regardless of whether or not the character is case-sensitive (e.g., '+').

- 26,712
- 17
- 57
- 60
-
This doesn't do title case, where small words (articles and prepositions) should not be capitalized. – brian d foy Oct 06 '08 at 01:19