10

我想采用驼峰式大小写的类名或枚举名,并以普通文本为用户显示。我怎样才能以编程方式做到这一点?

样本输入:

主页背景颜色

预期输出:

主页背景颜色

或者

主页背景颜色

4

6 回答 6

10

一个正则表达式选项:

public static string ToMeaningfulName(this string value)
{
    return Regex.Replace(value, "(?!^)([A-Z])", " $1");
}

输入“MainPageBackgroundColor”

输出-“主页背景颜色”

于 2013-06-13T19:26:53.340 回答
8

您可以通过以下方式将string CamelCase 转换为由空格分隔的可显示字符串:

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”。

于 2013-06-13T17:45:56.600 回答
2

只是为了解决问题,使用带有扩展方法的 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();
}

返回:“主页背景颜色”

于 2013-11-15T06:17:54.247 回答
1
string a = "asdfaGasfdasdAA";
a = a.Substring(0,1).ToUpper() + a.Substring(1,a.Length-1).ToLower();

我把琼斯的评论当作挑战......

于 2013-06-13T17:43:21.470 回答
0

这是我第一次这样做的方式。它速度快并且按预期工作,但是在看到其他答案后,我将其更改为我标记为答案的答案。

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;
}
于 2013-06-13T17:30:17.577 回答
0

StringBuilder 类的示例并表示为扩展方法。

public static string ToCapitalWithSpaces(this string status)
        {
            var response = new StringBuilder(status[..1]);

            foreach (var chr in status.Skip(1))
            {
                if (char.IsUpper(chr))
                    response.Append(" ");

                response.Append(chr);
            }

            return response.ToString();
        }
于 2021-10-05T13:05:08.673 回答