web-dev-qa-db-ja.com

文字列の最初の文字を大文字にする

DetailsViewTextBoxがあり、FIRST LETTER IN CAPITALで入力データ be 常に保存が欲しいのですが。

例:

"red" --> "Red"
"red house" --> " Red house"

どうやってこれを達成することができます パフォーマンスの最大化


_ note _
答えとその答えの下のコメントに基づいて、これは文字列中のall単語の大文字化について質問していると考える人が多くいます。例えば。 => Red House そうではありませんが、それがあなたが求めているものであれば TextInfoToTitleCaseメソッドを使用する答えの1つを探してください。 (注:実際に尋ねられた質問に対して、これらの回答は誤りです。
TextInfo.ToTitleCase doc を参照してください(すべて大文字の単語には触れません。頭字語と見なされます。単語の途中に小文字の "小文字を使わないでください"、など) "=>"マクドナルド ";大文字と小文字の区別に関するすべての文化固有の微妙な問題を処理することは保証されていません。)


_ note _
最初の文字の後の文字を forced 小文字にするかどうかについての質問はあいまいです。受け入れられた答えは最初の文字だけが変えられるべきですと仮定します。 最初の文字を除くすべての文字 _を強制的に小文字にしたい場合は、ToLowerToTitleCaseを含まないを含む答えを探してください。

381
anon

EDIT: また、拡張メソッドとして、より新しい構文(およびより正しい答え)に更新されました。

public static class StringExtensions
{
    public static string FirstCharToUpper(this string input)
    {
        switch (input)
        {
            case null: throw new ArgumentNullException(nameof(input));
            case "": throw new ArgumentException($"{nameof(input)} cannot be empty", nameof(input));
            default: return input.First().ToString().ToUpper() + input.Substring(1);
        }
    }
}

古い答え

public static string FirstCharToUpper(string input)
{
    if (String.IsNullOrEmpty(input))
        throw new ArgumentException("ARGH!");
    return input.First().ToString().ToUpper() + String.Join("", input.Skip(1));
}

_ edit _ :このバージョンはもっと短いです。もっと早い解決策としては、 Equiso's answer をご覧ください。

public static string FirstCharToUpper(string input)
{
    if (String.IsNullOrEmpty(input))
        throw new ArgumentException("ARGH!");
    return input.First().ToString().ToUpper() + input.Substring(1);
}

EDIT 2 :おそらく最速の解決策は Darren's (ベンチマークさえあります)ですが、元の要件では最初の文字が存在することを想定して例外をスローするようにstring.IsNullOrEmpty(s)バリデーションを変更します大文字にする。このコードは一般的な文字列に対して機能し、特にTextboxからの有効な値に対しては機能しません。

475
Carlos Muñoz
public string FirstLetterToUpper(string str)
{
    if (str == null)
        return null;

    if (str.Length > 1)
        return char.ToUpper(str[0]) + str.Substring(1);

    return str.ToUpper();
}

昔の答え:これは大文字へのすべての最初の文字を作る

public string ToTitleCase(string str)
{
    return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());
}
287
Diego Torres

正しい方法は、Cultureを使用することです。

Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(Word.ToLower())

注: これにより、文字列内の各Wordが大文字になります。 "レッドハウス" - > "レッドハウス"解決策はまた、単語内の小文字の大文字小文字を区別します。 "古いマクドナルド" - > "古いマクドナルド".

127

私は http://www.dotnetperls.com/uppercase-first-letter から最速の方法を取り、拡張方法に変換しました:

    /// <summary>
    /// Returns the input string with the first character converted to uppercase, or mutates any nulls passed into string.Empty
    /// </summary>
    public static string FirstLetterToUpperCaseOrConvertNullToEmptyString(this string s)
    {
        if (string.IsNullOrEmpty(s))
            return string.Empty;

        char[] a = s.ToCharArray();
        a[0] = char.ToUpper(a[0]);
        return new string(a);
    }

注:ToCharArrayを使用する理由は代替のchar.ToUpper(s[0]) + s.Substring(1)より速いです、1つの文字列だけが割り当てられるのに対して、Substringアプローチは部分文字列に文字列を割り当て、次に2番目の文字列が最終結果を構成するためです。


_ edit _ :これは CarlosMuñozが受け付ける答えからの最初のテストと組み合わせたものです

    /// <summary>
    /// Returns the input string with the first character converted to uppercase
    /// </summary>
    public static string FirstLetterToUpperCase(this string s)
    {
        if (string.IsNullOrEmpty(s))
            throw new ArgumentException("There is no first letter");

        char[] a = s.ToCharArray();
        a[0] = char.ToUpper(a[0]);
        return new string(a);
    }
49
Darren

「ToTitleCaseメソッド」を使用することができます

string s = new CultureInfo("en-US").TextInfo.ToTitleCase("red house");
//result : Red House

この拡張方法はすべてのタイトルケース問題を解決します。

使いやすい

string str = "red house";
str.ToTitleCase();
//result : Red house

string str = "red house";
str.ToTitleCase(TitleCase.All);
//result : Red House

extensionメソッド

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

namespace Test
{
    public static class StringHelper
    {
        private static CultureInfo ci = new CultureInfo("en-US");
        //Convert all first latter
        public static string ToTitleCase(this string str)
        {
            str = str.ToLower();
            var strArray = str.Split(' ');
            if (strArray.Length > 1)
            {
                strArray[0] = ci.TextInfo.ToTitleCase(strArray[0]);
                return string.Join(" ", strArray);
            }
            return ci.TextInfo.ToTitleCase(str);
        }
        public static string ToTitleCase(this string str, TitleCase tcase)
        {
            str = str.ToLower();
            switch (tcase)
            {
                case TitleCase.First:
                    var strArray = str.Split(' ');
                    if (strArray.Length > 1)
                    {
                        strArray[0] = ci.TextInfo.ToTitleCase(strArray[0]);
                        return string.Join(" ", strArray);
                    }
                    break;
                case TitleCase.All:
                    return ci.TextInfo.ToTitleCase(str);
                default:
                    break;
            }
            return ci.TextInfo.ToTitleCase(str);
        }
    }

    public enum TitleCase
    {
        First,
        All
    }
}
41

エラーチェック付きの最初の文字

public string CapitalizeFirstLetter(string s)
{
    if (String.IsNullOrEmpty(s))
        return s;
    if (s.Length == 1)
        return s.ToUpper();
    return s.Remove(1).ToUpper() + s.Substring(1);
}

これは便利な拡張機能と同じです。

public static string CapitalizeFirstLetter(this string s)
    {
    if (String.IsNullOrEmpty(s)) return s;
    if (s.Length == 1) return s.ToUpper();
    return s.Remove(1).ToUpper() + s.Substring(1);
    }
31
Kobi
public static string ToInvarianTitleCase(this string self)
{
    if (string.IsNullOrWhiteSpace(self))
    {
        return self;
    }

    return CultureInfo.InvariantCulture.TextInfo.ToTitleCase(self);
}
9
Taras Alenin

パフォーマンスやメモリ使用量が問題になる場合は、これで、元の文字列と同じサイズのStringBuilderと新しいStringが1つだけ作成されます。

public static string ToUpperFirst(this string str) {
  if( !string.IsNullOrEmpty( str ) ) {
    StringBuilder sb = new StringBuilder(str);
    sb[0] = char.ToUpper(sb[0]);

    return sb.ToString();

  } else return str;
}
6
Daniel Halan

これを試して:

static public string UpperCaseFirstCharacter(this string text) {
    return Regex.Replace(text, "^[a-z]", m => m.Value.ToUpper());
}
4
JoelFan

最初の文字を大文字にするだけで、残りの文字列が問題にならない場合は、最初の文字を選択するだけで、最初の文字を大文字にして、元の最初の文字を除いた残りの文字列と連結できます。

String Word ="red house";
Word = Word[0].ToString().ToUpper() + Word.Substring(1, Word.length -1);
//result: Word = "Red house"

最初の文字をToString()に変換する必要があります。これはChar配列として読み取っているため、Char型にはToUpper()メソッドがありません。

3
Víctor García

これは拡張メソッドとしてそれをする方法です:

static public string UpperCaseFirstCharacter(this string text)
{
    if (!string.IsNullOrEmpty(text))
    {
        return string.Format(
            "{0}{1}",
            text.Substring(0, 1).ToUpper(),
            text.Substring(1));
    }

    return text;
}

そのようにすることができます:

//yields "This is Brian's test.":
"this is Brian's test.".UpperCaseFirstCharacter(); 

そして、ここにいくつかのユニットテストがあります。

[Test]
public void UpperCaseFirstCharacter_ZeroLength_ReturnsOriginal()
{
    string orig = "";
    string result = orig.UpperCaseFirstCharacter();

    Assert.AreEqual(orig, result);
}

[Test]
public void UpperCaseFirstCharacter_SingleCharacter_ReturnsCapital()
{
    string orig = "c";
    string result = orig.UpperCaseFirstCharacter();

    Assert.AreEqual("C", result);
}

[Test]
public void UpperCaseFirstCharacter_StandardInput_CapitalizeOnlyFirstLetter()
{
    string orig = "this is Brian's test.";
    string result = orig.UpperCaseFirstCharacter();

    Assert.AreEqual("This is Brian's test.", result);
}
3
bingles

最速の方法です。

  private string Capitalize(string s){
        if (string.IsNullOrEmpty(s))
        {
            return string.Empty;
        }
        char[] a = s.ToCharArray();
        a[0] = char.ToUpper(a[0]);
        return new string(a);
}

テストは次の結果を表示します(入力として10000000記号の付いた文字列): テスト結果

私はここで何かを見つけました http://www.dotnetperls.com/uppercase-first-letter

static string UppercaseFirst(string s)
{
// Check for empty string.
if (string.IsNullOrEmpty(s))
{
    return string.Empty;
}
// Return char and concat substring.
return char.ToUpper(s[0]) + s.Substring(1);
}

多分これは役立ちます!

3
student

偶然にもこれに取り組んでいて、何かアイデアを探し回っていたので、これが私がやって来た解決策です。これはLINQを使用し、最初の文字が文字でなくても、文字列の最初の文字を大文字にすることができます。これが私が作った拡張方法です。

public static string CaptalizeFirstLetter(this string data)
{
    var chars = data.ToCharArray();

    // Find the Index of the first letter
    var charac = data.First(char.IsLetter);
    var i = data.IndexOf(charac);

    // capitalize that letter
    chars[i] = char.ToUpper(chars[i]);

    return new string(chars);
}

これを少し最適化またはクリーンアップする方法があると確信しています。

3
CAOakley

これはそれをするでしょうが、それはまた御言葉の冒頭にない誤った首都がないことを確かにするでしょうが。

public string(string s)
{
System.Globalization.CultureInfo c = new System.Globalization.CultureInfo("en-us", false)
System.Globalization.TextInfo t = c.TextInfo;

return t.ToTitleCase(s);
}
2
Jeff Hornby

あなたが必要とするのがすべてであるとき、ここにたくさんの複雑さがあるようです:

    /// <summary>
    /// Returns the input string with the first character converted to uppercase if a letter
    /// </summary>
    /// <remarks>Null input returns null</remarks>
    public static string FirstLetterToUpperCase(this string s)
    {
        if (string.IsNullOrWhiteSpace(s))
            return s;

        return char.ToUpper(s[0]) + s.Substring(1);
    }

注目すべき点:

  1. その拡張方法.

  2. 入力がnull、空、または空白の場合、入力はそのまま返されます。

  3. String.IsNullOrWhiteSpace は.NET Framework 4で導入されました。これは古いフレームワークでは動作しません。

2
Stephen Kennedy

「最高のパフォーマンス」という回答を提供したいと思いました。私の考えでは、「最大パフォーマンス」の回答はすべてのシナリオを把握し、それらのシナリオを考慮した質問に対する回答を提供します。だから、ここに私の答えです。これらの理由で:

  1. IsNullOrWhiteSpaceは、スペースまたはnull /空の文字列を扱います。
  2. .Trim()は、文字列の前後から空白を削除します。
  3. .First()は、数えられない(または文字列)の最初の文字を取ります。
  4. 大文字にすることができる/する必要がある文字であるかどうかを確認する必要があります。
  5. その後、文字列の残りの部分を追加します。長さが必要な長さである場合に限ります。
  6. .NETベストプラクティスによって、System.Globalization.CultureInfoの下にカルチャを提供する必要があります。
  7. オプションのパラメータとしてそれらを提供することは、毎回選択されたカルチャをタイプする必要なしにこの方法を完全に再利用可能にします。

    public static string capString(string instring, string culture = "en-US", bool useSystem = false)
    {
        string outstring;
        if (String.IsNullOrWhiteSpace(instring))
        {
            return "";
        }
        instring = instring.Trim();
        char thisletter = instring.First();
        if (!char.IsLetter(thisletter))
        {
            return instring;   
        }
        outstring = thisletter.ToString().ToUpper(new CultureInfo(culture, useSystem));
        if (instring.Length > 1)
        {
            outstring += instring.Substring(1);
        }
        return outstring;
    }
    
1
Patrick Knott

私は以下の方法が最善の解決策だと思います

    class Program
{
    static string UppercaseWords(string value)
    {
        char[] array = value.ToCharArray();
        // Handle the first letter in the string.
        if (array.Length >= 1)
        {
            if (char.IsLower(array[0]))
            {
                array[0] = char.ToUpper(array[0]);
            }
        }
        // Scan through the letters, checking for spaces.
        // ... Uppercase the lowercase letters following spaces.
        for (int i = 1; i < array.Length; i++)
        {
            if (array[i - 1] == ' ')
            {
                if (char.IsLower(array[i]))
                {
                    array[i] = char.ToUpper(array[i]);
                }
            }
        }
        return new string(array);
    }

    static void Main()
    {
        // Uppercase words in these strings.
        const string value1 = "something in the way";
        const string value2 = "dot net PERLS";
        const string value3 = "String_two;three";
        const string value4 = " sam";
        // ... Compute the uppercase strings.
        Console.WriteLine(UppercaseWords(value1));
        Console.WriteLine(UppercaseWords(value2));
        Console.WriteLine(UppercaseWords(value3));
        Console.WriteLine(UppercaseWords(value4));
    }
}

Output

Something In The Way
Dot Net PERLS
String_two;three
 Sam

ref

1
D.JCode
string emp="TENDULKAR";
string output;
output=emp.First().ToString().ToUpper() + String.Join("", emp.Skip(1)).ToLower();
1
Shailesh

最初の文字を大文字にする最も簡単な方法は次のとおりです。

1- System.Globalizationを使用します。

  // Creates a TextInfo based on the "en-US" culture.
  TextInfo myTI = new CultureInfo("en-US",false).

  myTI.ToTitleCase(textboxname.Text)

`

0
Saad Khalid

ここで与えられた解決策のどれも文字列の前に空白を扱わないように思えます。

これを考えとして追加するだけです。

public static string SetFirstCharUpper2(string aValue, bool aIgonreLeadingSpaces = true)
{
    if (string.IsNullOrWhiteSpace(aValue))
        return aValue;

    string trimmed = aIgonreLeadingSpaces 
           ? aValue.TrimStart() 
           : aValue;

    return char.ToUpper(trimmed[0]) + trimmed.Substring(1);
}   

それはthis won't work on other answers(その文は最初にスペースがある)を処理するべきです、そして、あなたがスペーストリミングが好きでないならば、ちょうど2番目のパラメータとしてfalsename__を渡してください(または処理したいならデフォルトをfalsename__に変え、truename__を渡してください)スペース)

0
Noctis
0
Dinis Cruz

これは最初の文字とスペースに続くすべての文字を大文字にし、それ以外の文字は小文字にします。

public string CapitalizeFirstLetterAfterSpace(string input)
{
    System.Text.StringBuilder sb = new System.Text.StringBuilder(input);
    bool capitalizeNextLetter = true;
    for(int pos = 0; pos < sb.Length; pos++)
    {
        if(capitalizeNextLetter)
        {
            sb[pos]=System.Char.ToUpper(sb[pos]);
            capitalizeNextLetter = false;
        }
        else
        {
            sb[pos]=System.Char.ToLower(sb[pos]);
        }

        if(sb[pos]=' ')
        {
            capitalizeNextLetter=true;
        }
    }
}
0
thattolleyguy

次のコードを使用してください。

string  strtest ="PRASHANT";
strtest.First().ToString().ToUpper() + strtest.Remove(0, 1).ToLower();
0

次の関数はあらゆる点で正しいです。

static string UppercaseWords(string value)
{
    char[] array = value.ToCharArray();
    // Handle the first letter in the string.
    if (array.Length >= 1)
    {
        if (char.IsLower(array[0]))
        {
            array[0] = char.ToUpper(array[0]);
        }
    }
    // Scan through the letters, checking for spaces.
    // ... Uppercase the lowercase letters following spaces.
    for (int i = 1; i < array.Length; i++)
    {
        if (array[i - 1] == ' ')
        {
            if (char.IsLower(array[i]))
            {
                array[i] = char.ToUpper(array[i]);
            }
        }
    }
    return new string(array);
}

私はそれを見つけました ここ

0
Dari

最近私は同じような要求があり、LINQ関数Select()がインデックスを提供することを思い出しました:

string input;
string output;

input = "red house";
output = String.Concat(input.Select((currentChar, index) => index == 0 ? Char.ToUpper(currentChar) : currentChar));
//output = "Red house"

私はそれを頻繁に必要としているので、文字列型の拡張メソッドを作りました。

public static class StringExtensions
{
    public static string FirstLetterToUpper(this string input)
    {
        if (string.IsNullOrEmpty(input))
            return string.Empty;
        return String.Concat(input.Select((currentChar, index) => index == 0 ? Char.ToUpper(currentChar) : currentChar));
    }
}

最初の文字だけが大文字に変換され、残りの文字はすべて触れられないことに注意してください。他の文字を小文字にする必要がある場合は、index> 0の場合はChar.ToLower(currentChar)を呼び出すか、最初の文字列全体でToLower()を呼び出します。

パフォーマンスについては、コードとDarrenのソリューションを比較しました。私のマシンでは、Darrenのコードは約2倍高速です。これは彼がchar配列内の最初の文字だけを直接編集しているためです。最速の解決策が必要な場合は、Darrenのコードを利用することをお勧めします。他の文字列操作も統合したい場合は、入力文字列の文字に触れるラムダ関数の表現力を持たせるのが便利かもしれません - あなたはこの関数を簡単に拡張することができます - そこで私はここでこの解決を残します。

0
Grimm

上記のCarlosの質問を拡張して、もしあなたが複数の文章を大文字にしたいのなら、このコードを使うことができます:

    /// <summary>
    /// Capitalize first letter of every sentence. 
    /// </summary>
    /// <param name="inputSting"></param>
    /// <returns></returns>
    public string CapitalizeSentences (string inputSting)
    {
        string result = string.Empty;
        if (!string.IsNullOrEmpty(inputSting))
        {
            string[] sentences = inputSting.Split('.');

            foreach (string sentence in sentences)
            {
                result += string.Format ("{0}{1}.", sentence.First().ToString().ToUpper(), sentence.Substring(1)); 
            }
        }

        return result; 
    }
0
Zamir

最速の方法です:

public static unsafe void ToUpperFirst(this string str)
{
    if (str == null) return;
    fixed (char* ptr = str) 
        *ptr = char.ToUpper(*ptr);
}

元の文字列を変更せずに

public static unsafe string ToUpperFirst(this string str)
{
    if (str == null) return null;
    string ret = string.Copy(str);
    fixed (char* ptr = ret) 
        *ptr = char.ToUpper(*ptr);
    return ret;
}
0
Anonymous