web-dev-qa-db-ja.com

すべての最初の文字を大文字に変換し、単語ごとに残りを小文字にします

変換する必要があるテキストの文字列(主に5〜6語程度)があります。

現在、テキストは次のようになっています。

THIS IS MY TEXT RIGHT NOW

私はそれをに変換したい:

This Is My Text Right Now

文字列のコレクションをループできますが、このテキスト変更の実行方法がわかりません。

106
mrblah
string s = "THIS IS MY TEXT RIGHT NOW";

s = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());
243
jspcal

私はおそらくToTitleCaseCultureInfoSystem.Globalization)thanThread.CurrentThreadSystem.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

参照:

82
Filippo Vitale

文字列の最初の文字を大文字に変換する方法はいくつかあります。

最初の方法は、最初の文字を単にキャップし、サブストリングを使用して残りのストリングを追加するメソッドを作成することです。

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);
    }
16
Jamie Dixon

Webページで使用している場合は、CSSも使用できます。

style="text-transform:capitalize;"

9
M.Eren Çelik

テストされていませんが、次のように動作します:

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

本質的には、「別の英数字の後に続く英数字のすべての出現で正規表現の一致を作成し、それを小文字のバージョンに置き換えます」

8
George Mauer

大きなテーブルを構築する場合、速度が問題になるため、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ソリューションの方が高速かもしれません。

6
Serj Sagan

以下のソリューションが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();
2
ephemient

このテクニックを試してください。目的の結果を返します

CultureInfo.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());

System.Globalizationを使用することを忘れないでください。

0
X Stylish

最初の答えに加えて、文字列selectionstartインデックスをWordの末尾に変更することを忘れないでください。そうしないと、文字列の文字の順序が逆になります。

s.SelectionStart=s.Length;
0
zia khan