[Fork] ToTitleCaseExamples

CSharp · Console

/Program.cs

using System;
using System.Text;
using System.Globalization;
using System.Text.RegularExpressions;

public class Program
{
	public static void Main()
	{
		DisplayOutputs("GPS");		
		DisplayOutputs("sk8_r");
		DisplayOutputs("sk_8r");
		DisplayOutputs("love ASP .net");
		DisplayOutputs(".net");
		DisplayOutputs("PeaCe aNd WaR");
		DisplayOutputs("a b c");
		DisplayOutputs("Mr. McGregor"); //The floating uppercase is ignored
		DisplayOutputs("Artis-Payne");
		DisplayOutputs("sing-a-long");
		DisplayOutputs("a.b,c/d[e]f_g{h}i=j!k@l`m~n#o$p%q^r&s(t)u|v?w*x<y>z:a;b");
		DisplayOutputs("7up");
		DisplayOutputs("7up 21st");
		DisplayOutputs("7up __st");
		DisplayOutputs("s8s");
		DisplayOutputs("#YOLO");
		DisplayOutputs("  space start"); //Solution with Regex and TextInfo blows up on this one
	}

	private static void DisplayOutputs(string input)
	{
		Console.WriteLine($"--------------Outputs for {input}----------------");
		var textInfo = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo;
		Console.WriteLine(textInfo.ToTitleCase(input) + " -- Expected Output");
		//SOLUTIONS FROM https://stackoverflow.com/questions/38360688
		Console.WriteLine(input.ToTitleCaseAnswer3() + " --Tokenizer with split and character inspection");		
		Console.WriteLine(input.ToTitleCaseAnswer1() + " --Simple tokenizer with split");
		Console.WriteLine(input.ToTitleCaseAnswer2() + " --Regex and TextInfo");		
		Console.WriteLine("");
	}
}

public static class StringHelper
{
	private static readonly CultureInfo _cultureInfo = CultureInfo.InvariantCulture;
	public static string ToTitleCaseAnswer1(this string str)
	{
		var tokens = str.Split(new[]{" "}, StringSplitOptions.RemoveEmptyEntries);
		for (var i = 0; i < tokens.Length; i++)
		{
			var token = tokens[i];
			if (token == token.ToUpper())
				tokens[i] = token;
			else if (token[0] == '-')
				tokens[i] = "-" + token.Substring(1, 2).ToUpper() + token.Substring(2).ToLower();
			else
				tokens[i] = token.Substring(0, 1).ToUpper() + token.Substring(1).ToLower();
		}

		return string.Join(" ", tokens);
	}

	public static string ToTitleCaseAnswer3(this string str)
	{
		var tokens = str.Split(new[]{" "}, StringSplitOptions.None);
		var stringBuilder = new StringBuilder();
		for (var ti = 0; ti < tokens.Length; ti++)
		{
			var token = tokens[ti];
			if (token == token.ToUpper())
				stringBuilder.Append(token + " ");
			else
			{
				var previousWasSeperator = false;
				var previousWasNumber = false;
				var ignoreNumber = false;
				for (var i = 0; i < token.Length; i++)
				{
					if (char.IsNumber(token[i]))
					{
						stringBuilder.Append(token[i]);
						previousWasNumber = true;
					}
					else if (!char.IsLetter(token[i]))
					{
						stringBuilder.Append(token[i]);
						previousWasSeperator = true;
					}
					else if ((previousWasNumber && !ignoreNumber) || previousWasSeperator)
					{
						stringBuilder.Append(char.ToUpper(token[i]));
						previousWasSeperator = false;
						previousWasNumber = false;
					}
					else if (i == 0)
					{
						ignoreNumber = true;
						stringBuilder.Append(char.ToUpper(token[i]));
					}
					else
					{
						ignoreNumber = true;
						stringBuilder.Append(char.ToLower(token[i]));
					}
				}

				stringBuilder.Append(" ");
			}
		}

		return stringBuilder.ToString().TrimEnd();
	}

	public static string ToTitleCaseAnswer2(this string str)
	{
		var tokens = Regex.Split(_cultureInfo.TextInfo.ToLower(str), "([ -])");
		for (var i = 0; i < tokens.Length; i++)
		{
			if (!Regex.IsMatch(tokens[i], "^[ -]$"))
			{
				tokens[i] = $"{_cultureInfo.TextInfo.ToUpper(tokens[i].Substring(0, 1))}{tokens[i].Substring(1)}";
			}
		}

		return string.Join("", tokens);
	}
}
;