C# で名前と姓の最初の文字を大文字にするにはどうすればよいですか?
-
09-06-2019 - |
質問
文字列の最初の文字を大文字にし、残りの文字を小文字にする簡単な方法はありますか?組み込みメソッドはありますか、それとも独自に作成する必要がありますか?
解決
TextInfo.ToTitleCase()
文字列の各トークンの最初の文字を大文字にします。
頭字語の大文字を維持する必要がない場合は、以下を含める必要があります。 ToLower()
.
string s = "JOHN DOE";
s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());
// Produces "John Doe"
CurrentCulture が使用できない場合は、次を使用します。
string s = "JOHN DOE";
s = new System.Globalization.CultureInfo("en-US", false).TextInfo.ToTitleCase(s.ToLower());
を参照してください。 MSDN リンク 詳細な説明については、
他のヒント
CultureInfo.CurrentCulture.TextInfo.ToTitleCase("hello world");
String test = "HELLO HOW ARE YOU";
string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test);
上記のコードは機能しません....
したがって、以下のコードを lower に変換して配置し、関数を適用します
String test = "HELLO HOW ARE YOU";
string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test.ToLower());
というケースもありますが、 CultureInfo.CurrentCulture.TextInfo.ToTitleCase
たとえば、次のようなものは処理できません。アポストロフィ '
.
string input = CultureInfo.CurrentCulture.TextInfo.ToTitleCase("o'reilly, m'grego, d'angelo");
// input = O'reilly, M'grego, D'angelo
あ 正規表現 も使用できます \b[a-zA-Z]
単語境界の後の単語の開始文字を識別する \b
, 、その後、一致するものを大文字の等価性で置き換えるだけで済みます。 Regex.Replace(string input,string pattern,MatchEvaluator evaluator)
方法 :
string input = "o'reilly, m'grego, d'angelo";
input = Regex.Replace(input.ToLower(), @"\b[a-zA-Z]", m => m.Value.ToUpper());
// input = O'Reilly, M'Grego, D'Angelo
の 正規表現 必要に応じて調整できます。たとえば、 MacDonald
そして McFry
この場合、正規表現は次のようになります。 (?<=\b(?:mc|mac)?)[a-zA-Z]
string input = "o'reilly, m'grego, d'angelo, macdonald's, mcfry";
input = Regex.Replace(input.ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z]", m => m.Value.ToUpper());
// input = O'Reilly, M'Grego, D'Angelo, MacDonald'S, McFry
さらに多くのプレフィックスを処理する必要がある場合は、グループを変更するだけで済みます。 (?:mc|mac)
, 、たとえばフランス語の接頭辞を追加する場合 du, de
: (?:mc|mac|du|de)
.
最後に、これが 正規表現 場合にも一致します MacDonald'S
最後に 's
したがって、それを処理する必要があります 正規表現 後ろ向きに否定的な表情を浮かべて (?<!'s\b)
. 。最後に次のようになります。
string input = "o'reilly, m'grego, d'angelo, macdonald's, mcfry";
input = Regex.Replace(input.ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)", m => m.Value.ToUpper());
// input = O'Reilly, M'Grego, D'Angelo, MacDonald's, McFry
Mc と Mac は米国全土で一般的な姓の接頭辞ですが、他にもあります。TextInfo.ToTitleCase はこれらのケースを処理しないため、この目的には使用しないでください。私のやり方は次のとおりです。
public static string ToTitleCase(string str)
{
string result = str;
if (!string.IsNullOrEmpty(str))
{
var words = str.Split(' ');
for (int index = 0; index < words.Length; index++)
{
var s = words[index];
if (s.Length > 0)
{
words[index] = s[0].ToString().ToUpper() + s.Substring(1);
}
}
result = string.Join(" ", words);
}
return result;
}
ToTitleCase() は機能するはずです。
最も直接的なオプションは、 タイトルケースへ .NET で使用できるこの関数は、ほとんどの場合、名前を処理する必要があります。として エッジ 機能しない名前がいくつかあると指摘しましたが、これらはかなりまれであるため、そのような名前が一般的である文化をターゲットにしている場合を除き、あまり心配する必要はありません。
ただし、.NET 言語を使用していない場合は、入力内容によって異なります。名と姓に 2 つの別々のフィールドがある場合は、次のようにして最初の文字を大文字にし、残りの文字を小さくするだけです。部分文字列。
firstName = firstName.Substring(0, 1).ToUpper() + firstName.Substring(1).ToLower();
lastName = lastName.Substring(0, 1).ToUpper() + lastName.Substring(1).ToLower();
ただし、同じ文字列の一部として複数の名前が提供されている場合は、情報をどのように取得しているかを知る必要があります。 それを分割します それに応じて。したがって、「John Doe」のような名前を取得した場合は、スペース文字に基づいて文字列を分割します。「Doe, John」のような形式の場合は、カンマに基づいて分割する必要があります。ただし、分割したら、前に示したコードを適用するだけです。
CultureInfo.CurrentCulture.TextInfo.ToTitleCase (「私の名前」);
~ 私の名前を返します
しかし、前述したように、McFly のような名前には問題が依然として存在します。
私はこれを修正するために独自の方法を使用しています。
たとえば次のようなフレーズです。"こんにちは世界。「こんにちは、これはスタックオーバーフローの世界です。」は「Hello World.こんにちは、これは Stackoverflow の世界です。」正規表現 \b (単語の始まり) \w (単語の最初の文字) がうまく機能します。
/// <summary>
/// Makes each first letter of a word uppercase. The rest will be lowercase
/// </summary>
/// <param name="Phrase"></param>
/// <returns></returns>
public static string FormatWordsWithFirstCapital(string Phrase)
{
MatchCollection Matches = Regex.Matches(Phrase, "\\b\\w");
Phrase = Phrase.ToLower();
foreach (Match Match in Matches)
Phrase = Phrase.Remove(Match.Index, 1).Insert(Match.Index, Match.Value.ToUpper());
return Phrase;
}
ToTitleCase を使用するという提案は、すべて大文字の文字列には機能しません。したがって、最初の文字で ToUpper を呼び出し、残りの文字で ToLower を呼び出す必要があります。
このクラスはその役割を果たします。新しいプレフィックスを追加できます。 _prefixes 静的な文字列配列。
public static class StringExtensions
{
public static string ToProperCase( this string original )
{
if( String.IsNullOrEmpty( original ) )
return original;
string result = _properNameRx.Replace( original.ToLower( CultureInfo.CurrentCulture ), HandleWord );
return result;
}
public static string WordToProperCase( this string word )
{
if( String.IsNullOrEmpty( word ) )
return word;
if( word.Length > 1 )
return Char.ToUpper( word[0], CultureInfo.CurrentCulture ) + word.Substring( 1 );
return word.ToUpper( CultureInfo.CurrentCulture );
}
private static readonly Regex _properNameRx = new Regex( @"\b(\w+)\b" );
private static readonly string[] _prefixes = {
"mc"
};
private static string HandleWord( Match m )
{
string word = m.Groups[1].Value;
foreach( string prefix in _prefixes )
{
if( word.StartsWith( prefix, StringComparison.CurrentCultureIgnoreCase ) )
return prefix.WordToProperCase() + word.Substring( prefix.Length ).WordToProperCase();
}
return word.WordToProperCase();
}
}
vS2k8 を使用している場合は、拡張メソッドを使用してそれを String クラスに追加できます。
public static string FirstLetterToUpper(this String input)
{
return input = input.Substring(0, 1).ToUpper() +
input.Substring(1, input.Length - 1);
}
強調表示されているいくつかの問題を回避するには、まず文字列を小文字に変換してから、ToTitleCase メソッドを呼び出すことをお勧めします。その後、IndexOf(" Mc") または IndexOf(" O\'") を使用して、より具体的な注意が必要な特殊なケースを判断できます。
inputString = inputString.ToLower();
inputString = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(inputString);
int indexOfMc = inputString.IndexOf(" Mc");
if(indexOfMc > 0)
{
inputString.Substring(0, indexOfMc + 3) + inputString[indexOfMc + 3].ToString().ToUpper() + inputString.Substring(indexOfMc + 4);
}
私はこの方法が好きです:
using System.Globalization;
...
TextInfo myTi = new CultureInfo("en-Us",false).TextInfo;
string raw = "THIS IS ALL CAPS";
string firstCapOnly = myTi.ToTitleCase(raw.ToLower());
これから引き上げられる MSDN の記事.
これがお役に立てば幸いです。
String fName = "firstname";
String lName = "lastname";
String capitalizedFName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(fName);
String capitalizedLName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(lName);
public static string ConvertToCaptilize(string input)
{
if (!string.IsNullOrEmpty(input))
{
string[] arrUserInput = input.Split(' ');
// Initialize a string builder object for the output
StringBuilder sbOutPut = new StringBuilder();
// Loop thru each character in the string array
foreach (string str in arrUserInput)
{
if (!string.IsNullOrEmpty(str))
{
var charArray = str.ToCharArray();
int k = 0;
foreach (var cr in charArray)
{
char c;
c = k == 0 ? char.ToUpper(cr) : char.ToLower(cr);
sbOutPut.Append(c);
k++;
}
}
sbOutPut.Append(" ");
}
return sbOutPut.ToString();
}
return string.Empty;
}
edg が示したように、特殊な名前を処理するには、より複雑なアルゴリズムが必要になります (多くの場所ですべてを大文字に強制するのはおそらくこれが理由です)。
この未テストの C# のようなものは、要求した単純なケースを処理する必要があります。
public string SentenceCase(string input)
{
return input(0, 1).ToUpper + input.Substring(1).ToLower;
}