Reputation: 3977
I need to capitalized the first letter of each word in a string and also capitalized specific
words in the string if the length of the word is two. I can specify the two words in a <list>
or Array
.
Previous question and solution provided here capitalizes every word containing two letters. But this becomes a problem if someone name is only two letters. Example: Ja Rule
or Robert Mo
. I need to capitalized things like: NW SW MD
if they appear in a string.
The following code capitalizes first letters of each word and both letters of words containing two characters. Again, this becomes a problem for two letter names:
var input = "dr. david BOWIE md";
TextInfo tCase = new CultureInfo("en-US", false).TextInfo;
var result = tCase.ToTitleCase(input.ToLower());
result = string.Join(" ", result.Split(' ')
.Select(i => i.Length == 2 ? i.ToUpperInvariant() : i));
Output:
Dr. David Bowie MD
Problem:
Jason De
, also becomes Jason DE
Thanks.
Upvotes: 0
Views: 301
Reputation: 354
"a computer is a stupid machine with the ability to do incredibly smart things", (Bill Bryson)
You need to give the computer the ability to distinguish between name and degree. Determining titles could happen by several approaches:
If your are able to distinguish, then your shall give your program the same ability.
Be aware, that if cases exist where you just don't know if it is a name or a title then the computer cannot outsmart you. (Actually, there is the possibility to let your program scan a huge data source (i.e. the whole internet) and let it percept all possible titles and names and then let it decide if the "li" in "jet li" is a title or a name.)
Best regards
Upvotes: 0
Reputation: 19111
Might something as simple as this solve your problem?
var list = new List<string>{" of ", " is ", " an ", " to "};
var x = "This is an example of stuff to replace.";
foreach(var word in list){
x = x.Replace(word, word.ToUpper());
// Alternative if you don`t want to put spaces in the list:
// x = x.Replace(" " + word + " ", " " + word.ToUpper() + " ");
}
The result will be: This IS AN example OF stuff TO replace.
Upvotes: 0
Reputation: 13888
Specify 2 letter words you want to capitalize (or 2 letter words you don't if list is shorter) and check if that word is contained in the list, if it is then capitalize whole word, otherwise leave it as title case
var input = "dr. david BOWIE md";
TextInfo tCase = new CultureInfo("en-US", false).TextInfo;
var result = tCase.ToTitleCase(input.ToLower());
var wordsToCapitalize = new []{"nw", "dw", "md"};
result = string.Join(" ", result.Split(' ')
.Select(i => (i.Length == 2 && wordsToCapitalize.Contains(i.ToLower())) ? i.ToUpperInvariant() : i));
Assert.That(result, Is.EqualTo("Dr. David Bowie MD"));
You could also either title case inside the select, or have the words in the list title cased.
Upvotes: 1
Reputation: 24825
Here is the logic (as I cannot write c# very quickly and need to scoot off)
Split string into words.
Count length of words (4 for dr david bowie MD)
loop through each word until you get to last word in array ->
If length of array > 2 then last word - all capitals else - just capitalise as normal.
Upvotes: 0