web-dev-qa-db-ja.com

C#で各Wordの最初の文字、または文字列全体の最初の文字を大文字にする方法は?

私はそれを行うために独自のアルゴリズムを書くことができましたが、C#では Ruby's humanize と同等のものがあるはずだと感じています。

私はそれをグーグルで検索しましたが、日付を人間化する方法を見つけました。

例:

  • 「Lorem Lipsum Et」を「Lorem lipsum et」に変える方法
  • 「Lorem lipsum et」を「Lorem Lipsum Et」に変える方法
57
marcgg

@ miguel's answer のコメントで説明したように、 TextInfo.ToTitleCase これは.NET 1.1以降で利用可能です。あなたの例に対応するコードは次のとおりです。

string lipsum1 = "Lorem lipsum et";

// Creates a TextInfo based on the "en-US" culture.
TextInfo textInfo = new CultureInfo("en-US",false).TextInfo;

// Changes a string to titlecase.
Console.WriteLine("\"{0}\" to titlecase: {1}", 
                  lipsum1, 
                  textInfo.ToTitleCase( lipsum1 )); 

// Will output: "Lorem lipsum et" to titlecase: Lorem Lipsum Et

「LOREM LIPSUM ET」など、すべて大文字の大文字小文字を無視します。これは、頭字語がテキストに含まれている場合に対応しているためです(そのため、「 [〜#〜] nambla [〜#〜] 「「ナンブラ」や「ナンブラ」にはなりません)。

ただし、最初の文字のみを大文字にしたい場合は、 here …を超える解決策を実行できます。または、文字列を分割してリストの最初の文字を大文字にすることもできます。

string lipsum2 = "Lorem Lipsum Et";

string lipsum2lower = textInfo.ToLower(lipsum2);

string[] lipsum2split = lipsum2lower.Split(' ');

bool first = true;

foreach (string s in lipsum2split)
{
    if (first)
    {
        Console.Write("{0} ", textInfo.ToTitleCase(s));
        first = false;
    }
    else
    {
        Console.Write("{0} ", s);
    }
}

// Will output: Lorem lipsum et 
112
Spoike

これに正規表現を使用すると、はるかにきれいに見えます。

string s = "the quick brown fox jumps over the lazy dog";
s = Regex.Replace(s, @"(^\w)|(\s\w)", m => m.Value.ToUpper());
31
Xela

別のエレガントなソリューションがあります:

プロジェクトのstaticクラスで関数ToTitleCaseを定義します

using System.Globalization;

public static string ToTitleCase(this string title)
{
    return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(title.ToLower()); 
}

そして、プロジェクトのどこでも文字列拡張のように使用します:

"have a good day !".ToTitleCase() // "Have A Good Day !"
13
G.Busato

最初の文字を大文字にしたいだけなら、あなた自身のユーティリティメソッドにこれを貼り付けてください:

return string.IsNullOrEmpty(str) 
    ? str
    : str[0].ToUpperInvariant() + str.Substring(1).ToLowerInvariant();

すべてのWordの最初の文字を大文字にするライブラリメソッドもあります。

http://msdn.Microsoft.com/en-us/library/system.globalization.textinfo.totitlecase.aspx

2

CSSテクニックは大丈夫ですが、ブラウザの文字列の表示を変更するだけです。より良い方法は、ブラウザに送信する前にテキスト自体を大文字にすることです。

上記の実装の大部分は問題ありませんが、保持する必要がある大文字と小文字が混在する単語がある場合、または真のタイトルケースを使用する場合に発生する問題に対処するものはありません。

「米国のPHdコースを勉強する場所」

または

「IRSフォームUB40a」

また、CultureInfo.CurrentCulture.TextInfo.ToTitleCase(string)を使用すると、「スポーツとMLB野球」のように大文字の単語が保持されます。

そのため、大文字と大文字小文字の混在した単語を保持し、specialCasesおよびlowerCases文字列配列に含めることで、小文字の単語を小文字にする(フレーズの先頭と末尾にない場合)ことができる単純な関数を作成しました。

public static string TitleCase(string value) {
        string titleString = ""; // destination string, this will be returned by function
        if (!String.IsNullOrEmpty(value)) {
            string[] lowerCases = new string[12] { "of", "the", "in", "a", "an", "to", "and", "at", "from", "by", "on", "or"}; // list of lower case words that should only be capitalised at start and end of title
            string[] specialCases = new string[7] { "UK", "USA", "IRS", "UCLA", "PHd", "UB40a", "MSc" }; // list of words that need capitalisation preserved at any point in title
            string[] words = value.ToLower().Split(' ');
            bool wordAdded = false; // flag to confirm whether this Word appears in special case list
            int counter = 1;
            foreach (string s in words) {

                // check if Word appears in lower case list
                foreach (string lcWord in lowerCases) {
                    if (s.ToLower() == lcWord) {
                        // if lower case Word is the first or last Word of the title then it still needs capital so skip this bit.
                        if (counter == 0 || counter == words.Length) { break; };
                        titleString += lcWord;
                        wordAdded = true;
                        break;
                    }
                }

                // check if Word appears in special case list
                foreach (string scWord in specialCases) {
                    if (s.ToUpper() == scWord.ToUpper()) {
                        titleString += scWord;
                        wordAdded = true;
                        break;
                    }
                }

                if (!wordAdded) { // Word does not appear in special cases or lower cases, so capitalise first letter and add to destination string
                    titleString += char.ToUpper(s[0]) + s.Substring(1).ToLower();
                }
                wordAdded = false;

                if (counter < words.Length) {
                    titleString += " "; //dont forget to add spaces back in again!
                }
                counter++;
            }
        }
        return titleString;
    }

これはただの簡単で簡単な方法です-より多くの時間を費やしたい場合は、おそらく少し改善することができます。

「a」や「of」のような小さい単語の大文字を保持したい場合は、特殊な場合の文字列配列からそれらを削除してください。組織ごとに大文字化のルールが異なります。

このサイトで実際に動作するこのコードの例を見ることができます。 Egg Donation London -このサイトは、URLを解析することにより、ページの上部にパンくずリストを自動的に作成します(例: "/ services/uk-Egg-銀行/紹介」-トレイル内の各フォルダー名のハイフンがスペースに置き換えられ、フォルダー名が大文字になるため、uk-Egg-bankはUK Egg Bankになります。 (大文字の「UK」を保持)

このコードの拡張機能は、共有テキストファイル、データベーステーブル、またはWebサービスに頭字語と大文字/小文字のルックアップテーブルを作成して、大文字と小文字が混在する単語のリストを1か所から管理し、さまざまな場所に適用できるようにすることです機能に依存するアプリケーション。

1
Myke Black

.NETで適切な言語の大文字化を行うための事前に構築されたソリューションはありません。どのような資本化を目指していますか?シカゴのスタイルマニュアルの規則に従っていますか? AMAまたはMLA?わかりやすい英語の文大文字でも、単語には1000の特別な例外があります。私はRubyのヒューマナイズが何をするかについて話すことはできませんが、おそらく大文字の言語学的なルールに従わず、代わりにもっと簡単なことを行うと思います。

内部的には、この同じ問題に遭遇し、文の大文字小文字を考慮せずに、記事タイトルの適切な(私たちの小さな世界では)大文字小文字を処理するためだけにかなり大量のコードを記述する必要がありました。そして、実際には「ファジー」になります:)

それは本当にあなたが必要とするものに依存します-なぜあなたは文章を適切な大文字に変換しようとしていますか(そしてどんな文脈で)?

0
patjbs

すべての例は、他のキャラクターを最初に下げたように見えますが、それは私が必要とするものではありません。

customerName = CustomerName <-どちらが欲しかったのか

this is an example = This Is An Example

public static string ToUpperEveryWord(this string s)
{
    // Check for empty string.  
    if (string.IsNullOrEmpty(s))
    {
        return string.Empty;
    }

    var words = s.Split(' ');

    var t = "";
    foreach (var Word in words)
    {
        t += char.ToUpper(Word[0]) + Word.Substring(1) + ' ';
    }
    return t.Trim();
}
0
Demodave

私が知っている限りでは、コードを記述(または切り詰め)せずにそれを行う方法はありません。 C#ネット(ha!)の場合、上、下、およびタイトル(持っているもの)の場合:

http://support.Microsoft.com/kb/312890/EN-US/

0
vinny