2009-05-26 24 views
48

それを行うための独自のアルゴリズムを書くことができましたが、C#でruby's humanizeに相当するはずです。各単語の最初の文字、または文字列全体の最初の文字をC#で大文字にする方法は?

私はそれを見つけましたが、日付を人間化する方法しか見つけませんでした。

例:

  • "Loremのlipsumら"
  • "LoremのLipsumをEt"
+1

私は何らかの理由でLorem Lipsumと言っています^^ – marcgg

+3

いつも正規表現があります! string strToCap = strSource.ToLower(); Regex rCapitalize = new Regex( "(?<= [!\?] \ s +)[A-Za-z]"); strToCap = rCapitalize.Replace(strToCap、m => {return m.Value.ToUpper();}); ...しかし、2つの問題があります。:) – rijipooh

+3

元の質問とは逆のコードへの受け入れられた回答へのリンクとして、私は両方向を尋ねる質問を編集しました。この質問は今後のユーザーにとってはまったく混乱しないことを願っています。それにつまずく。 –

答えて

90

@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 

頭文字がテキストにあれば、(「NAMBLA」ように、それは例の世話をしているので、このようなすべての「LoremのLIPSUM ET」としてキャップされている筐体の事を無視します"nambla"または "Nambla"にはなりません)。

しかしあなただけがhere上で解決策を行うことができ、最初の文字を大文字にしたい...またはあなただけの文字列を分割し、リスト内の最初のものを生かすことができれば:

string lipsum2 = "Lorem Lipsum Et"; 

string lipsum2lower = textInfo.ToLower(lipsum1); 

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 
+0

これについてもっと多くの人が知りません。これは素晴らしい方法です。 – Coops

+2

Haha 3年後、NAMBLAはまだ私を笑わせます.Oh、+1 ToTitleCase() –

+1

ToTitleCase 1stで見つかった問題は1Stになります。 –

2
に "Loremのlipsumら" を有効にする方法に "LoremのLipsumのEt" を有効にする方法あなただけの最初の文字を大文字にしたい場合は

、ちょうどあなた自身のユーティリティメソッドでこれをスティック:

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

は、すべての単語の最初の文字を大文字にもライブラリー法があります:

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

+0

それはちょうどあなたにタイトルを与えるでしょう: "Lorem Ipsum Et"、文例ではない: "Lorem ipsum et"、そうですか? – vinny

+0

私はそれが反対をすると思います。 –

+0

私はこれを考えていましたが、ToTitleCaseはOPが望んでいるものの反対です。 –

0

を私の知る限りでは、それを行うための方法は、(またはカンニング)、コードを記述することなく、そこにはありません。 C#のネット(HA!)あなたの上面、下面及びタイトル(あなたが持っているもの)例:

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

0

は.NETで適切な言語的captializationのためのビルド済みのソリューションはありません。どのような資本化を行っていますか?シカゴ・マニュアル・スタイル・コンベンションに従っていますか? AMAまたはMLA?普通の英語の大文字の大文字でさえ、1000年の特別な単語の例外があります。私はルビの人間化が何をしているか話すことはできませんが、それはおそらく大文字の言語規則に従わず、ずっと簡単なことをしていると思います。

内部的に私たちはこの同じ問題に遭遇し、文章の大文字さえ考慮しなくても、文章タイトルの適切な(ちょっとした世界で)大文字小文字を処理するために相当量のコードを書く必要がありました。そして、実際には "あいまい"になります:)

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

0

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

上記implimentationsのほとんどはOKですが、あなたは保存する必要がある場合の単語を混入している場合、またはあなたが、たとえば、真のタイトルケースを使用したい場合は、それらのどれもが、何が起こるかの問題に対処しない:

「アメリカで博士号コースを勉強する」

または

「IRSフォームUB40a」

またCultureInfo.CurrentCulture.TextInfo.ToTitleCase(文字列)を使用してのように大文字の単語を維持します10「スポーツとMLB野球」となる「スポーツと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 - このサイトは、「/ services/uk-egg-bank/introduction」などのURLを解析することで、ページ上部にブレッドクラムを自動的に作成します。トレイル内の各フォルダ名にハイフンがスペースで置き換えられ、フォルダ名が大文字に変換されるため、uk-egg-bankはUK Egg Bankになります。

このコードを拡張すると、共有テキストファイル、データベーステーブル、またはWebサービスの頭字語と大文字/小文字の検索テーブルを持つことができ、大文字と小文字が混在したリスト単語を1つの場所から維持し、機能に依存する多くの異なるアプリケーションに適用することができます。

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

使用正規表現は非常にきれいに見えます

機能ToTitleCaseを定義し、あなたの挙の静的クラスを

using System.Globalization; 

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

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

"have a good day !".ToTitleCase() // "Have A Good Day !" 
+0

答えを広げる: 文字列s = "速い" s = Regex.Replace(s.ToLower()、@ "(^ \ w)|(\ s \ w)"、m => m.Value.ToUpper()); – mcandal

2

別のエレガントな解決策があります:このため

関連する問題