我需要转换一段文字(主要是大约5-6个单词)。
目前文字如下:
THIS IS MY TEXT RIGHT NOW
我想将其转换为:
This Is My Text Right Now
我可以遍历我的字符串集合,但不知道如何执行此文本修改。
答案 0 :(得分:241)
string s = "THIS IS MY TEXT RIGHT NOW";
s = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());
答案 1 :(得分:81)
我可能更喜欢从 CultureInfo ( System.Globalization )调用 ToTitleCase 而不是 Thread.CurrentThread ( 的System.Threading )
string s = "THIS IS MY TEXT RIGHT NOW";
s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());
但它应该与jspcal解决方案相同
修改强>
实际上这些解决方案不一样:CurrentThread
- 调用 - > CultureInfo
!
<强> System.Threading.Thread.CurrentThread.CurrentCulture 强>
string s = "THIS IS MY TEXT RIGHT NOW";
s = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());
IL_0000: ldstr "THIS IS MY TEXT RIGHT NOW"
IL_0005: stloc.0 // s
IL_0006: call System.Threading.Thread.get_CurrentThread
IL_000B: callvirt System.Threading.Thread.get_CurrentCulture
IL_0010: callvirt System.Globalization.CultureInfo.get_TextInfo
IL_0015: ldloc.0 // s
IL_0016: callvirt System.String.ToLower
IL_001B: callvirt System.Globalization.TextInfo.ToTitleCase
IL_0020: stloc.0 // s
<强> System.Globalization.CultureInfo.CurrentCulture 强>
string s = "THIS IS MY TEXT RIGHT NOW";
s = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());
IL_0000: ldstr "THIS IS MY TEXT RIGHT NOW"
IL_0005: stloc.0 // s
IL_0006: call System.Globalization.CultureInfo.get_CurrentCulture
IL_000B: callvirt System.Globalization.CultureInfo.get_TextInfo
IL_0010: ldloc.0 // s
IL_0011: callvirt System.String.ToLower
IL_0016: callvirt System.Globalization.TextInfo.ToTitleCase
IL_001B: stloc.0 // s
参考文献:
答案 2 :(得分:15)
有几种方法可以将字符串的第一个字符串转换为大写字母。
第一种方法是创建一个简单地封顶第一个字符的方法,并使用子字符串附加字符串的其余部分:
public string UppercaseFirst(string s)
{
return char.ToUpper(s[0]) + s.Substring(1);
}
第二种方式(稍微快一点)是将字符串拆分为char数组,然后重新构建字符串:
public string UppercaseFirst(string s)
{
char[] a = s.ToCharArray();
a[0] = char.ToUpper(a[0]);
return new string(a);
}
答案 3 :(得分:9)
如果您在网页上使用,也可以使用CSS:
style="text-transform:capitalize;"
答案 4 :(得分:8)
未经测试,但这样的事情应该有效:
var phrase = "THIS IS MY TEXT RIGHT NOW";
var rx = new System.Text.RegularExpressions.Regex(@"(?<=\w)\w");
var newString = rx.Replace(phrase,new MatchEvaluator(m=>m.Value.ToLowerInvariant()));
基本上它表示“在所有出现的字母数字字符之后执行正则表达式匹配,该字符串跟随另一个字母数字字符,然后将其替换为自身的小写版本”
答案 5 :(得分:6)
建造大桌子时速度是一个值得关注的问题,因此Jamie Dixon的第二个功能是最好的,但它并不完全有效......
它无法将所有字母都缩写为小写,并且它只会将字符串的第一个字母大写,而不是字符串中每个单词的第一个字母...以下选项可以解决这两个问题:
public string UppercaseFirstEach(string s)
{
char[] a = s.ToLower().ToCharArray();
for (int i = 0; i < a.Count(); i++ )
{
a[i] = i == 0 || a[i-1] == ' ' ? char.ToUpper(a[i]) : a[i];
}
return new string(a);
}
虽然在这一点上,这仍然是最快的选择是不确定的,但是George Mauer提供的Regex
解决方案可能会更快......有足够关心的人应该测试它。
答案 6 :(得分:2)
我不知道下面的解决方案是否比jspcal的答案更有效或更低效,但我很确定它需要的创建对象的次数少于Jamie和George的。
string s = "THIS IS MY TEXT RIGHT NOW";
StringBuilder sb = new StringBuilder(s.Length);
bool capitalize = true;
foreach (char c in s) {
sb.Append(capitalize ? Char.ToUpper(c) : Char.ToLower(c));
capitalize = !Char.IsLetter(c);
}
return sb.ToString();
答案 7 :(得分:0)
除了第一个答案之外,请记住将字符串selectionstart索引更改为单词的结尾,否则您将在字符串中获得相反的字母顺序。
s.SelectionStart=s.Length;
答案 8 :(得分:0)
尝试这种技术;返回期望的结果
CultureInfo.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());
请不要忘记使用 System.Globalization
。
答案 9 :(得分:0)
您可能感兴趣的一种可能的解决方案。在一个循环中从右到左遍历一个字符数组,反之亦然。
public static string WordsToCapitalLetter(string value)
{
if (string.IsNullOrWhiteSpace(value))
{
throw new ArgumentException("value");
}
int inputValueCharLength = value.Length;
var valueAsCharArray = value.ToCharArray();
int min = 0;
int max = inputValueCharLength - 1;
while (max > min)
{
char left = value[min];
char previousLeft = (min == 0) ? left : value[min - 1];
char right = value[max];
char nextRight = (max == inputValueCharLength - 1) ? right : value[max - 1];
if (char.IsLetter(left) && !char.IsUpper(left) && char.IsWhiteSpace(previousLeft))
{
valueAsCharArray[min] = char.ToUpper(left);
}
if (char.IsLetter(right) && !char.IsUpper(right) && char.IsWhiteSpace(nextRight))
{
valueAsCharArray[max] = char.ToUpper(right);
}
min++;
max--;
}
return new string(valueAsCharArray);
}
答案 10 :(得分:0)
jspcal作为字符串扩展名的答案。
Program.cs
class Program
{
static void Main(string[] args)
{
var myText = "MYTEXT";
Console.WriteLine(myText.ToTitleCase()); //Mytext
}
}
StringExtensions.cs
using System;
public static class StringExtensions
{
public static string ToTitleCase(this string str)
{
if (str == null)
return null;
return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());
}
}