CSharp · Console
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);
}
}