Встроенный метод для преобразования строки в заголовок в .NET Core?

.NET Framework имеет метод TextInfo.ToTitleCase.

Есть ли что-то подобное в .NET Core?

Редактировать: я ищу встроенный метод в .NET Core.

Ответ 1

В .NET Standard 2.0 добавлено TextInfo.ToTitleCase (источник), поэтому вы можете использовать его в .NET Core 2.0.

Однако для поддержки .NET Core 1.x вам не повезло.

Ответ 2

Вы можете реализовать свой собственный метод расширения:

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

Кредит: blatently copyed gist *.

* Добавлен бит для акронимов Dotnet Fiddle.

Ответ 3

Кажется, что нет такого метода, встроенного в .NET Core.

Ответ 4

К сожалению, еще в октябре 2016 года .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);
     }
 }

Ответ 5

Я создал github для расширения с тестами и dotnet fiddle, который включает в себя другие решения этой должности. Вам придется раскомментировать линии, чтобы узнать, что выдает другие решения. Это решение охватывает все сценарии, которые приходили на ум. Вы можете проверить их в тестах на git или на скрипке. Я предлагаю вам использовать это решение, если вы хотите получить аналогичный вывод в TextInfo.ToTitleCase в .NET Framework.

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