【问题标题】:Built-in method to convert a string to title case in .NET Core?在.NET Core中将字符串转换为标题大小写的内置方法?
【发布时间】:2016-07-13 20:00:41
【问题描述】:

.NET Framework 有一个方法TextInfo.ToTitleCase

.NET Core 中有没有等价的东西?

编辑:我正在寻找 .NET Core 中的内置方法。

【问题讨论】:

标签: c# .net-core


【解决方案1】:

您可以实现自己的扩展方法:

public static class StringHelper
{
    public static string ToTitleCase(this string str)
    {
        var tokens = str.Split(new[] { " ", "-" }, StringSplitOptions.RemoveEmptyEntries);
        for (var i = 0; i < tokens.Length; i++)
        {
            var token = tokens[i];
            tokens[i] = token == token.ToUpper()
                ? token 
                : token.Substring(0, 1).ToUpper() + token.Substring(1).ToLower();
        }

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

信用:从gist* 公然复制。

*为首字母缩略词添加位Dotnet Fiddle

【讨论】:

  • 这不会做“正确”的标题大小写,但是旧的 .net 方法也没有。
  • OP 请求替换 TextInfo.ToTitleCase,而不是 正确的标题大小写,所以这个答案是正确的。而且效果也很好。
  • 此解决方案无法处理 ToTitleCase 处理的所有案例。查看我的解决方案。
  • 为什么要将- 的所有实例都转换为` `?这显然是一个错误。
  • @MahmoudAl-Qudsi 你读过剩下的代码了吗?你真的尝试过运行它吗?
【解决方案2】:

.NET Core 似乎没有内置这种方法。

【讨论】:

    【解决方案3】:

    .NET Standard 2.0 添加了TextInfo.ToTitleCase (source),因此您可以在.NET Core 2.0 中使用它。

    但是,对于 .NET Core 1.x 的支持,你很不走运。

    【讨论】:

      【解决方案4】:

      很遗憾,还是在 2016 年 10 月,.NET Core 还没有为我们提供ToTitleCase 方法。

      我自己创建了一个满足我自己需求的产品。您可以通过在正则表达式中添加自己的分隔符来调整它。 将_cultureInfo 替换为适用于您的CultureInfo 实例。

      public static class TextHelper
      {
           private static readonly CultureInfo _cultureInfo = CultureInfo.InvariantCulture;
      
           public static string ToTitleCase(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);
           }
       }
      

      【讨论】:

      • 如果 ToLower() 方法适合您的特定需求,请尝试删除。
      • 我不明白你的意思?删除 ToLower 会导致编译错误。 ToLower 和 ToUpper 是我看到的唯一选项。同样,此解决方案不处理首字母缩略词。
      • 对以空格结尾的字符串抛出异常。
      • @MahmoudAl-Qudsi 我猜在方法开头的字符串周围加上一个适当的.Trim() 就可以了?
      【解决方案5】:

      我为带有测试的扩展创建了一个 github,并创建了一个 dotnet fiddle,其中包括这篇文章中的其他解决方案。您必须取消注释行才能查看其他解决方案的输出。该解决方案涵盖了所有想到的场景。您可以在 git 或 fiddle 上的测试中验证这些。如果您想在非 .NET Core 中获得与 TextInfo.ToTitleCase 类似的输出,我建议您使用此解决方案。

       public static class StringExtension
      {
          /// <summary>
          /// Should capitalize the first letter of each word. Acronyms will stay uppercased.
          /// Anything after a non letter or number will keep be capitalized. 
          /// </summary>
          /// <param name="str"></param>
          /// <returns></returns>
          public static string ToTitleCase(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();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-15
        • 2010-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多