【问题标题】:How do I programmatically change CamelCase names to displayable names如何以编程方式将 CamelCase 名称更改为可显示的名称
【发布时间】:2013-06-13 17:30:17
【问题描述】:

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

样本输入:

MainPageBackgroundColor

预期输出:

主页背景颜色

主页背景颜色

【问题讨论】:

  • 小写整个字符串,然后大写第一个字母。一行代码就可以轻松搞定
  • 你能给出一些你想要输出的样本吗?
  • 我还应该补充一点,我已经知道枚举的样子,所以我不希望编码错误。下面是一个示例:BackgroundColor 将在组合框的 Header 属性中作为背景颜色显示给用户,并且枚举的值正在填充组合框。用户选择一种颜色并更新 ViewModel/UI。
  • @LanceMcCarthy 我发现this 正则表达式在将帕斯卡大小写名称拆分为单独的单词时最有用 - 我也希望它能够处理大写首字母缩略词。

标签: c# string


【解决方案1】:

一个正则表达式选项:

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

输入“MainPageBackgroundColor”

输出-“主页背景颜色”

【讨论】:

    【解决方案2】:

    您可以通过以下方式将 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”。

    【讨论】:

      【解决方案3】:

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

      返回: "主页背景颜色"

      【讨论】:

        【解决方案4】:
        string a = "asdfaGasfdasdAA";
        a = a.Substring(0,1).ToUpper() + a.Substring(1,a.Length-1).ToLower();
        

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

        【讨论】:

        • 请注意,这会将“SomeRandomEnumeration”转换为“Somerandomenumeration”,这不是人类可读的 :)
        • @ReedCopsey - 是的,但他想将类变成显示名称,这将是一个单词;)(对 OP - 你可以 .GetType().toString() 我认为)
        • 我没有看到任何说“一个词”的东西 - 问题表明他想“以普通文本为用户显示它”。对我来说,“普通文本”会暗示不止一个词
        • @ReedCopsey - “我想取一个班级名称”
        • @Sayse 这是一个驼峰式单词作为输入,但并不意味着他想要一个单词作为输出......
        【解决方案5】:

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

        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;
        }
        

        【讨论】:

        • 字符编码不同会怎样?答案是你得到垃圾输出。如果你想让它更具可读性,只需插入空格。名字毕竟是专有名词,英文规定每个单词的首字母大写。
        • 这不起作用 - 删除/插入/等创建新字符串,它们不会改变输入...
        • (应该是name = name.Remove(i, 1);等)话虽如此,我还是建议使用System.Char内置的方法)
        【解决方案6】:

        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();
                }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-16
          • 2010-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-12
          相关资源
          最近更新 更多