それを行うための独自のアルゴリズムを書くことができましたが、C#でruby's humanizeに相当するはずです。各単語の最初の文字、または文字列全体の最初の文字をC#で大文字にする方法は?
私はそれを見つけましたが、日付を人間化する方法しか見つけませんでした。
例:
- "Loremのlipsumら"
- "LoremのLipsumをEt"
それを行うための独自のアルゴリズムを書くことができましたが、C#でruby's humanizeに相当するはずです。各単語の最初の文字、または文字列全体の最初の文字をC#で大文字にする方法は?
私はそれを見つけましたが、日付を人間化する方法しか見つけませんでした。
例:
@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
これについてもっと多くの人が知りません。これは素晴らしい方法です。 – Coops
Haha 3年後、NAMBLAはまだ私を笑わせます.Oh、+1 ToTitleCase() –
ToTitleCase 1stで見つかった問題は1Stになります。 –
、ちょうどあなた自身のユーティリティメソッドでこれをスティック:
return string.IsNullOrEmpty(str)
? str
: str[0].ToUpperInvariant() + str.Substring(1).ToLowerInvariant();
は、すべての単語の最初の文字を大文字にもライブラリー法があります:
http://msdn.microsoft.com/en-us/library/system.globalization.textinfo.totitlecase.aspx
それはちょうどあなたにタイトルを与えるでしょう: "Lorem Ipsum Et"、文例ではない: "Lorem ipsum et"、そうですか? – vinny
私はそれが反対をすると思います。 –
私はこれを考えていましたが、ToTitleCaseはOPが望んでいるものの反対です。 –
を私の知る限りでは、それを行うための方法は、(またはカンニング)、コードを記述することなく、そこにはありません。 C#のネット(HA!)あなたの上面、下面及びタイトル(あなたが持っているもの)例:
は.NETで適切な言語的captializationのためのビルド済みのソリューションはありません。どのような資本化を行っていますか?シカゴ・マニュアル・スタイル・コンベンションに従っていますか? AMAまたはMLA?普通の英語の大文字の大文字でさえ、1000年の特別な単語の例外があります。私はルビの人間化が何をしているか話すことはできませんが、それはおそらく大文字の言語規則に従わず、ずっと簡単なことをしていると思います。
内部的に私たちはこの同じ問題に遭遇し、文章の大文字さえ考慮しなくても、文章タイトルの適切な(ちょっとした世界で)大文字小文字を処理するために相当量のコードを書く必要がありました。そして、実際には "あいまい"になります:)
これは本当に必要なものに依存します - なぜ文章を適切な大文字に変換しようとしていますか(そしてどのような文脈で)?
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());
使用正規表現は非常にきれいに見えます
機能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 !"
答えを広げる: 文字列s = "速い" s = Regex.Replace(s.ToLower()、@ "(^ \ w)|(\ s \ w)"、m => m.Value.ToUpper()); – mcandal
別のエレガントな解決策があります:このため
私は何らかの理由でLorem Lipsumと言っています^^ – marcgg
いつも正規表現があります! string strToCap = strSource.ToLower(); Regex rCapitalize = new Regex( "(?<= [!\?] \ s +)[A-Za-z]"); strToCap = rCapitalize.Replace(strToCap、m => {return m.Value.ToUpper();}); ...しかし、2つの問題があります。:) – rijipooh
元の質問とは逆のコードへの受け入れられた回答へのリンクとして、私は両方向を尋ねる質問を編集しました。この質問は今後のユーザーにとってはまったく混乱しないことを願っています。それにつまずく。 –