C#で姓と名の最初の文字を大文字にするにはどうすればよいですか?


141

文字列の最初の文字を大文字にし、残りの文字を下げる簡単な方法はありますか?組み込みのメソッドはありますか、それとも自分で作成する必要がありますか?


3
私はあなたの特定のアプリケーションについて何も知りませんが、一般的な警告の原因であると私は思います:プログラマーはこのメソッドを本当の名前に無用に適用すべきではありません。古いジョン・マクドナルドは彼の名前を変えてこの方法を混乱させるだろうと思う。イー・カミングス、ベル・フック、ダナ・ボイド、松本行弘、姓に「フォン」を持つ人々、姓に「オドイル」を持つ人々は言うまでもないなどなど。ほとんどの名前は、大文字と小文字が区別される(大文字で表記できる)形式の「First Last」の形式ではありません。kalzumeus.com/2010/06/17/…を
Nick

@ニックは絶対的に正しいです。小文字の後に大文字が続くのが間違っていると仮定することもできません-アイルランドの名前は「ÓhAirt」のようなことをします。頭に思い浮かぶことのできるすべての慣習について、あなたを驚かせる文化/言語があると仮定します。
James Moore

回答:


259

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リンクを参照してください。


24
ここで注意すべき点の1つは、文字列がすべて大文字の場合は機能しないことです。すべての大文字は頭字語であると考えています。
Mike Roosa、2008

9
私がこれらの多くで見たことは、あなたがそれらに依存することができないということです。名前がマケインのようなものである場合、またはより多くの外国の名前をヒットし始めた場合は機能しません。
マイクウィルズ

25
@roosa-そのToTitleCase(val.ToLower())の簡単な修正
Simon_Weaver

+1すでにFCLに含まれている必要があることを知っていて、グーグルがここに連れてきた= D
ギデオン

13
下記のネイサンの回答とは異なり、「非静的フィールド、メソッド、またはプロパティにはオブジェクト参照が必要です...」というエラーが発生します。
Dan W

117
CultureInfo.CurrentCulture.TextInfo.ToTitleCase("hello world");

ああスナップ!いい答えだ。グローバリゼーションのことはいつも忘れます。
マイケルハーレン

素晴らしい解決策!VB.Netで:sItem = Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(sItem.ToLower) 'first char upper case
Nasenbaer

現在のカルチャではなく、個々の名前のカルチャを検出する必要があります。これは名前に対しては機能しません。
James Moore

1
これはに依存しているので、CurrentCultureこれを異なる方法で処理する文化がないことをどのように確認できますか?
ルディー、2014年

30
String test = "HELLO HOW ARE YOU";
string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test);

上記のコードは動作しません.....

下に変換して下のコードを入れて、関数を適用します

String test = "HELLO HOW ARE YOU";
string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test.ToLower());

15

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

正規表現は、必要に応じて、我々が処理する場合、例えば、調整することが可能MacDonaldMcFry例を正規表現は次のようになります。(?<=\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

@polkduran名前の末尾のローマ数字を処理する方法を見つけるのに苦労しています。全部大文字にしたいのですが、ジョン・スミスIII。否定的な後読みはこれを妨げますか?
Matt

いつものように、ようやく自分の質問に答えることができました。ローマ数字に一致するようにオプションのグループを追加しました(大文字になります)。これが私が今使っている完全な正規表現です:(?<= \ b(?:mc | mac)?)[a-zA-Z](?<! 's \ b)(?: ii | iii | iv | v | vi | vii | viii | ix)?
Matt

あなたのケースは特別なケースです。回答の正規表現は、各名前(姓)を入力文字列(テスト入力文字列には複数の名前があります)内の孤立した単語として扱うため、「名前の終わり」の概念はありません。 。入力文字列を単一の名前として扱う場合は、正規表現の前に単純な条件を付けて、大文字と小文字を区別\b[ivxlcdm]+$|することができます\b[ivxlcdm]+$|(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)。厳密なローマ数字形式(ivxlcdm)を持たない名前のすべての末尾の単語を大文字にします。ただし、望ましくない結果が生じる場合があります。たとえば、「Li」は「LI」になります
polkduran

面白い。あなたの追加はおそらく構造に関してより正しいと思いますが、同意します...あなたが述べたいくつかの問題があると思います。上記の私の解決策では、サフィックスを "ix"までハードコードしました。これは私の場合に機能しますが、すべての人に適しているわけではないことを認識しています。
Matt

1
@ Si8、テストしましたか?Regex.Replace("JOHN DOE".ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)", m => m.Value.ToUpper())
polkduran 2016年

7

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;
    }


4

最も直接的なオプションは、.NETで使用可能なToTitleCase関数を使用することです。これは、ほとんどの場合、名前を処理する必要があります。edgとして指摘いくつかの名前があり、それは動作しませんが、あなたは、このような名前が、あなたはあまり心配する必要はことが必要なものではありません共通している文化をターゲットにしている場合を除き、これらはかなり珍しいそうであること。

ただし、.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」などの形式の場合は、コンマに基づいて分割する必要があります。ただし、分割したら、前に示したコードを適用するだけです。


3

CultureInfo.CurrentCulture.TextInfo.ToTitleCase( "私の名前");

私の名前を返します

しかし、問題は以前に述べたようにマクフライのような名前でまだ存在しています。


3
マクフライ!コニチワ、フギツさん
イアン・ボイド

@David Cスペースをnullに置き換えてみてください!! string.replace( ''、 '')のように
チンタン

3

私はこれを修正するために自分の方法を使用します:

たとえば、「hello world。hello this is the stackoverflow world。」というフレーズです。「Hello World。Hello This is the Stackoverflow World。」になります。正規表現\ 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;
}

2

ToTitleCaseを使用するための提案は、すべて大文字の文字列に対しては機能しません。したがって、最初の文字でToUpperを呼び出し、残りの文字でToLowerを呼び出す必要があります。


6
ToTitleCaseを呼び出す前に、入力文字列でToLowerを呼び出さないのはなぜですか?
アンディローズ

2

このクラスはトリックを行います。_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();
        }
}

1

vS2k8を使用している場合は、拡張メソッドを使用してそれをStringクラスに追加できます。

public static string FirstLetterToUpper(this String input)
{
    return input = input.Substring(0, 1).ToUpper() + 
       input.Substring(1, input.Length - 1);
}

9
Char.ToUpper(input[0]) + input.Substring(1)より読みやすい私見です。
Hosam Aly

私見ではinput.FirstLetterToUpper()確かに多い読めるChar.ToUpper(input[0]) + input.Substring(1)が、あまり透明
マイケル・

0

強調表示されている問題/問題のいくつかを回避するには、まず文字列を小文字に変換してから、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);
}

0

私はこのように好きです:

using System.Globalization;
...
TextInfo myTi = new CultureInfo("en-Us",false).TextInfo;
string raw = "THIS IS ALL CAPS";
string firstCapOnly = myTi.ToTitleCase(raw.ToLower());

このMSDNの記事から削除されました。


0

これがお役に立てば幸いです。

String fName = "firstname";
String lName = "lastname";
String capitalizedFName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(fName);
String capitalizedLName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(lName);

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

        }

-1

示されているedgのように、特殊な名前を処理するには、より複雑なアルゴリズムが必要になります(これが、多くの場所ですべてが大文字にされる理由です)。

この未テストのc#のようなものは、リクエストした単純なケースを処理する必要があります。

public string SentenceCase(string input)
{
    return input(0, 1).ToUpper + input.Substring(1).ToLower;
}

忘れてください-グローバリゼーションクラスstackoverflow.com/questions/72831/…を
Michael Haren
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.