Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

toTitleCase to ignore ordinals in C#

I'm trying to figure out a way to use toTitleCase to ignore ordinals. It works as I want it to for all string except for ordinals (e.g. 1st, 2nd, 3rd becomes 1St, 2Nd, 3Rd).

Any help would be appreciated. A regular expression may be the way to handle this, I'm just not sure how such a regex would be constructed.

Update: Here is the solution I used (Using John's answer I wrote below extension method):

public static string ToTitleCaseIgnoreOrdinals(this string text)
{
    string input = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(text);
    string result = System.Text.RegularExpressions.Regex.Replace(input, "([0-9]st)|([0-9]th)|([0-9]rd)|([0-9]nd)", new System.Text.RegularExpressions.MatchEvaluator((m) => m.Captures[0].Value.ToLower()), System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    return result;
}
like image 890
Ben Avatar asked Aug 06 '14 19:08

Ben


2 Answers

string input =  System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase("hello there, this is the 1st");
string result = System.Text.RegularExpressions.Regex.Replace(input, "([0-9]st)|([0-9]th)|([0-9]rd)|([0-9]nd)", new System.Text.RegularExpressions.MatchEvaluator((m) =>
{
    return m.Captures[0].Value.ToLower();
}), System.Text.RegularExpressions.RegexOptions.IgnoreCase);
like image 154
DiplomacyNotWar Avatar answered Oct 25 '22 01:10

DiplomacyNotWar


You can use regular expressions to check if the string starts with a digit before you convert to Title Case, like this:

if (!Regex.IsMatch(text, @"^\d+"))
{
   CultureInfo.CurrentCulture.TextInfo.toTitleCase(text);
}

Edit: forgot to reverse the conditional... changed so it will apply toTitleCase if it DOESN'T match.

2nd edit: added loop to check all words in a sentence:

string text = "150 east 40th street";



            string[] array = text.Split(' ');


            for (int i = 0; i < array.Length; i++)
            {
                if (!Regex.IsMatch(array[i], @"^\d+"))
                {
                    array[i] = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(array[i]);
                }
            }


            string newText = string.Join(" ",array);
like image 20
DrewJordan Avatar answered Oct 25 '22 03:10

DrewJordan