キャメルケースのクラス名または列挙名を取り、ユーザーに対して通常のテキストで表示したいと思います。プログラムでこれを行うにはどうすればよいですか?
サンプル入力:
メインページの背景色
期待される出力:
メインページの背景色
また
メインページの背景色
正規表現オプション:
public static string ToMeaningfulName(this string value)
{
return Regex.Replace(value, "(?!^)([A-Z])", " $1");
}
「MainPageBackgroundColor」を入力
出力 - 「メインページの背景色」
string
次の方法で、キャメルケースの a をスペースで区切られた表示可能な文字列に変換できます。
public static string DisplayCamelCaseString(string camelCase)
{
List<char> chars = new List<char>();
chars.Add(camelCase[0]);
foreach(char c in camelCase.Skip(1))
{
if (char.IsUpper(c))
{
chars.Add(' ');
chars.Add(char.ToLower(c));
}
else
chars.Add(c);
}
return new string(chars.ToArray());
}
これにより、「CamelCase」から「Camel case」または「SomeRandomEnumeration」から「Some random enumeration」に変換されます。
締めくくりとして、Linq と拡張メソッドを使用した代替ソリューションを紹介します。
public static string ToSentenceCase(this string value)
{
string[] spacedWords
= ((IEnumerable<char>)value).Skip(1)
.Select(c => c == char.ToUpper(c)
? " " + char.ToLower(c).ToString()
: c.ToString()).ToArray();
string result = value.Substring(0, 1)
+ (String.Join("", spacedWords)).Trim();
return result;
}
戻り値: 「メイン ページの背景色」
public static string ToTitleCase(this string value)
{
string[] spacedWords
= ((IEnumerable<char>)value)
.Select(c => c == char.ToUpper(c)
? " " + c.ToString()
: c.ToString()).ToArray();
return (String.Join("", spacedWords)).Trim();
}
戻り値: 「メイン ページの背景色」
これが私が最初に行った方法です。高速で期待どおりに動作しますが、他の回答を見て、回答としてマークしたものに変更しました。
public static string CamelCaseToDisplayName<T>(this T enumeration)
{
string name = enumeration.ToString();
for (int i = 1; i < name.Length; i++)
{
char c = name[i];
if (c >= 'A' && c <= 'Z')
{
name = name.Remove(i, 1);
name = name.Insert(i++, ((char)(c + 0x30)).ToString());
name = name.Insert(i, " ");
}
}
return name;
}