C# 在.NET Core中将字符串转换为标题大小写的内置方法?
NET框架有一个方法 在.NETCore中有类似的东西吗C# 在.NET Core中将字符串转换为标题大小写的内置方法?,c#,.net-core,C#,.net Core,NET框架有一个方法 在.NETCore中有类似的东西吗 编辑:我正在寻找.NET Core中的内置方法。您可以实现自己的扩展方法: public static class StringHelper { public static string ToTitleCase(this string str) { var tokens = str.Split(new[] { " ", "-" }, StringSplitOptions.RemoveEmptyEntries
编辑:我正在寻找.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);
}
}
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();
}
}
公共静态类StringHelper
{
公共静态字符串ToTitleCase(此字符串str)
{
var tokens=str.Split(新[]{“,”-“},StringSplitOptions.RemoveEmptyEntries);
for(var i=0;i
信用证:本表明目张胆地抄袭*
*添加了首字母缩略词的位。似乎在.NET Core中没有内置这样的方法。不幸的是,直到2016年10月,.NET Core还没有为我们提供一个
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();
}
}
我自己创造了一个适合我自己需要的。您可以通过向正则表达式添加自己的分隔符来调整它。
将\u 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);
}
}
公共静态类TextHelper
{
私有静态只读CultureInfo _CultureInfo=CultureInfo.InvariantCulture;
公共静态字符串ToTitleCase(此字符串str)
{
var tokens=Regex.Split(_cultureInfo.TextInfo.ToLower(str),“([-])”;
for(var i=0;i
我为带有测试的扩展创建了一个,以及一个包含本文中其他解决方案的扩展。您必须取消对行的注释,以查看其他解决方案的输出。此解决方案涵盖了所有想到的场景。您可以在git或fiddle上的测试中验证这些。如果希望在非.NET内核中获得与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();
}
}
公共静态类StringExtension
{
///
///应大写每个单词的第一个字母。首字母缩略词将保持大写。
///非字母或数字后面的任何内容都将保持大写。
///
///
///
公共静态字符串ToTitleCase(此字符串str)
{
var tokens=str.Split(new[]{”“},StringSplitOptions.None);
var stringBuilder=新的stringBuilder();
for(var ti=0;ti
添加了.NET标准2.0(),因此您可以在.NET Core 2.0中使用它
但是,对于.NET Core 1.x支持,您的运气不好。这里是参考源代码中的代码,但是复制到您自己的项目中看起来并不简单。也许你可以试试。@Eser的可能副本不是副本,Q与.NET无关Core@mxmissileRegex在.NET Core中不可用?这不适用于“正确”的标题大小写,但是旧的.NET方法也不适用。OP请求替换
TextInfo.ToTitleCase
,而不是正确的标题大小写,因此此答案是正确的。这个解决方案并不能处理ToitLecase所处理的所有情况。查看我的解决方案。为什么要将-
的所有实例转换为```?这显然是一个错误。@MahmoudAl Qudsi你读过代码的其余部分了吗?你真的试过运行它吗?试着删除ToLower()
方法,如果它适合你的特定需要。我不知道你的意思?删除ToLower会导致编译错误。ToLower和ToUpper是我看到的唯一选择。同样,此解决方案不处理首字母缩略词。在以空格结尾的字符串上引发异常。@MahmoudAl Qudsi我想在方法开头的字符串周围使用适当的.Trim()
可以解决这个问题吗?