web-dev-qa-db-ja.com

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

文字列の最初の文字を大文字にして残りを減らす簡単な方法はありますか?組み込みのメソッドはありますか、独自のメソッドを作成する必要がありますか?

139
Mike Roosa

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

257
ageektrapped
CultureInfo.CurrentCulture.TextInfo.ToTitleCase("hello world");
118
Nathan Baulch
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());

CultureInfo.CurrentCulture.TextInfo.ToTitleCaseが処理できない場合がいくつかあります。たとえば、アポストロフィ'です。

string input = CultureInfo.CurrentCulture.TextInfo.ToTitleCase("o'reilly, m'grego, d'angelo");
// input = O'reilly, M'grego, D'angelo

regexは、\b[a-zA-Z]を使用して、Word境界の後にWordの開始文字を識別する\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

regexは、必要に応じて調整できます。たとえば、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)を追加できます。

最後に、このregexは最後のMacDonald'Sの場合'sにも一致するため、処理する必要があることを理解できます。 regexで、(?<!'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
14
polkduran

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

ToTitleCase()が機能するはずです。

http://support.Microsoft.com/kb/31289

5
ckal

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

4
rjzii

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

たとえば、「hello world。hello this is the stackoverflow world。」というフレーズです。 「HelloWorld。HelloThis Is The Stackoverflow World。」になります。正規表現\ b(Wordの開始)\ w(Wordの最初の文字)がトリックを行います。

/// <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;
}
3
Ton Snoei

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

〜My Nameを返します

しかし、先に述べたように、McFlyのような名前にはまだ問題があります。

3
David C

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

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

2
Tundey

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

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

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

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

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

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