.NET Framework имеет метод TextInfo.ToTitleCase.
Есть ли что-то подобное в .NET Core?
Редактировать: я ищу встроенный метод в .NET Core.
.NET Framework имеет метод TextInfo.ToTitleCase.
Есть ли что-то подобное в .NET Core?
Редактировать: я ищу встроенный метод в .NET Core.
В .NET Standard 2.0 добавлено TextInfo.ToTitleCase (источник), поэтому вы можете использовать его в .NET Core 2.0.
Однако для поддержки .NET Core 1.x вам не повезло.
Вы можете реализовать свой собственный метод расширения:
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.
Кажется, что нет такого метода, встроенного в .NET Core.
К сожалению, еще в октябре 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);
}
}
Я создал 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();
}
}