簡體   English   中英

在.NET Core中將字符串轉換為標題大小寫的內置方法?

[英]Built-in method to convert a string to title case in .NET Core?

.NET Framework有一個方法TextInfo.ToTitleCase

.NET Core 中是否有等價的東西?

編輯:我正在尋找 .NET Core 中的內置方法。

您可以實現自己的擴展方法:

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

信用:從這個要點*中公然復制。

*為首字母縮略詞Dotnet Fiddle添加了位。

.NET Core 似乎沒有內置這種方法。

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

然而,對於 .NET Core 1.x 的支持,你就不走運了。

不幸的是,還是在 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);
     }
 }

我為帶有測試的擴展創建了一個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();
    }
}

這在.net核心中對我有用

 public static string ToTitleCase(this string str)
        {
            try
            {
                var tokens = str.Split(new[] { " ", "-" }, StringSplitOptions.RemoveEmptyEntries);
                string final = "";

                for (var i = 0; i < tokens.Length; i++)
                {
                    var token = tokens[i];

                    string first = token.Substring(0, 1);
                    string remaining = token.Substring(1, token.Length - 1);

                    final +=  first.ToUpper() + remaining.ToLower()+" ";

                }

                return final;
            }
            catch {
                return "";
            }
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM