変換する必要があるテキストの文字列(主に5〜6語程度)があります。
現在、テキストは次のようになっています。
THIS IS MY TEXT RIGHT NOW
私はそれをに変換したい:
This Is My Text Right Now
文字列のコレクションをループできますが、このテキスト変更の実行方法がわかりません。
string s = "THIS IS MY TEXT RIGHT NOW";
s = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());
私はおそらくToTitleCaseをCultureInfo(System.Globalization)thanThread.CurrentThread(System.Threading )
string s = "THIS IS MY TEXT RIGHT NOW";
s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());
しかし、それはjspcalソリューションと同じでなければなりません
編集
実際には、これらのソリューションは同じではありません:CurrentThread
--calls-> 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
参照:
文字列の最初の文字を大文字に変換する方法はいくつかあります。
最初の方法は、最初の文字を単にキャップし、サブストリングを使用して残りのストリングを追加するメソッドを作成することです。
public string UppercaseFirst(string s)
{
return char.ToUpper(s[0]) + s.Substring(1);
}
2番目の方法(わずかに高速)は、文字列をchar配列に分割し、文字列を再構築します。
public string UppercaseFirst(string s)
{
char[] a = s.ToCharArray();
a[0] = char.ToUpper(a[0]);
return new string(a);
}
Webページで使用している場合は、CSSも使用できます。
style="text-transform:capitalize;"
テストされていませんが、次のように動作します:
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()));
本質的には、「別の英数字の後に続く英数字のすべての出現で正規表現の一致を作成し、それを小文字のバージョンに置き換えます」
大きなテーブルを構築する場合、速度が問題になるため、Jamie Dixonの2番目の機能が最適ですが、完全に機能するわけではありません...
すべての文字を小文字にすることはできず、文字列の各単語の最初の文字ではなく、文字列の最初の文字のみを大文字にします...以下のオプションは両方の問題を修正します:
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
ソリューションの方が高速かもしれません。
以下のソリューションが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();
このテクニックを試してください。目的の結果を返します
CultureInfo.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());
System.Globalization
を使用することを忘れないでください。
最初の答えに加えて、文字列selectionstartインデックスをWordの末尾に変更することを忘れないでください。そうしないと、文字列の文字の順序が逆になります。
s.SelectionStart=s.Length;