2016-07-13 16 views
11

.NET FrameworkのメソッドはTextInfo.ToTitleCaseです。文字列をタイトルケースに変換する組み込みメソッド?

.NETコアに相当するものはありますか?

編集:.NETコアで組み込みのメソッドを探しています。

+0

参照元のコードは次のとおりですが、自分のプロジェクトにコピーするのは簡単ではありません。しかし、あなたが試みることができるかもしれません。 http://referencesource.microsoft.com/#mscorlib/system/globalization/textinfo.cs,5f96501d72edadce –

+2

[Transform string to title case]の重複可能性があります(http://stackoverflow.com/questions/23860116/transform-string- to-title-case) – Eser

+5

@Eserは重複ではなく、Qは.NETコアとは関係ありません – mxmissile

答えて

4

.NET標準2.0は、.NETのコア2.0でそれを使用することができますので、TextInfo.ToTitleCasesource)を追加しました。

ただし、.NET Core 1.xのサポートでは不運です。

21

独自の拡張メソッドを実装することができます

public static class StringHelper 
{ 
    public static string ToTitleCase(this string str) 
    { 
     var tokens = str.Split(new[] { " ", "-" }, StringSplitOptions.RemoveEmptyEntries); 
     for (var i = 0; i < tokens.Length; i++) 
     { 
      var token = tokens[i]; 
      tokens[i] = token == token.ToUpper() 
       ? token 
       : token.Substring(0, 1).ToUpper() + token.Substring(1).ToLower(); 
     } 

     return string.Join(" ", tokens); 
    } 
} 

クレジット:このgist * blatentlyコピーされたフォームを。

*頭文字のDotnet Fiddleのビットが追加されました。

+0

これは "適切な"タイトルケーシングをしませんが、古い.netメソッドはどちらもしませんでした。 – mxmissile

+4

OPはTextInfo.ToTitleCaseの代わりに_properタイトルのケーシング_の代わりを要求します。この答えは正しいです。また、うまくいく。 –

+0

このソリューションは、ToTitleCaseが処理したすべてのケースを処理しません。私の解決策を見てください。 – DeadlyChambers

10

.NET Coreには、このようなメソッドが組み込まれていないようです。

1

残念ながら、2016年10月の.NET Coreでは、ToTitleCaseメソッドは提供されていません。

自分のニーズに合った自分自身を作成し​​ました。正規表現に独自の区切り文字を追加することで調整できます。 _cultureInfoを、あなたに該当するCultureInfoインスタンスに置き換えてください。

public static class TextHelper 
{ 
    private static readonly CultureInfo _cultureInfo = CultureInfo.InvariantCulture; 

    public static string ToTitleCase(this string str) 
    { 
     var tokens = Regex.Split(_cultureInfo.TextInfo.ToLower(str), "([ -])"); 

     for (var i = 0; i < tokens.Length; i++) 
     { 
      if (!Regex.IsMatch(tokens[i], "^[ -]$")) 
      { 
       tokens[i] = $"{_cultureInfo.TextInfo.ToUpper(tokens[i].Substring(0, 1))}{tokens[i].Substring(1)}"; 
      } 
     } 

     return string.Join("", tokens); 
    } 
} 
+0

この解決法は頭字語を扱いませんhttps://dotnetfiddle.net/Suwfcg – DeadlyChambers

+0

あなたの特定のニーズに対応している場合は、ToLower()メソッドを削除してみてください。 – silkfire

+0

あなたは何を意味するのですか? ToLowerを削除すると、コンパイルエラーが発生します。 ToLowerとToUpperは私が見る唯一のオプションです。ここでも、この解決法は略語を扱いません。 – DeadlyChambers

1

私はこの記事から、他のソリューションが含まれているテストと拡張のためのgithubを作成し、dotnet fiddle。他のソリューションの出力内容を確認するには、行のコメントを外す必要があります。このソリューションは、思い付いたすべてのシナリオを網羅しています。 gitやフィドルのテストでこれらを確認することができます。私は非.NET CoreのTextInfo.ToTitleCaseに似た出力を得たい場合は、このソリューションを使用することをお勧めします。

public static class StringExtension 
{ 
    /// <summary> 
    /// Should capitalize the first letter of each word. Acronyms will stay uppercased. 
    /// Anything after a non letter or number will keep be capitalized. 
    /// </summary> 
    /// <param name="str"></param> 
    /// <returns></returns> 
    public static string ToTitleCase(this string str) 
    { 
     var tokens = str.Split(new[] { " " }, StringSplitOptions.None); 
     var stringBuilder = new StringBuilder(); 
     for (var ti = 0; ti < tokens.Length; ti++) 
     { 
      var token = tokens[ti]; 
      if (token == token.ToUpper()) 
       stringBuilder.Append(token + " "); 
      else 
      { 
       var previousWasSeperator = false; 
       var previousWasNumber = false; 
       var ignoreNumber = false; 
       for (var i = 0; i < token.Length; i++) 
       { 

        if (char.IsNumber(token[i])) 
        { 
         stringBuilder.Append(token[i]); 
         previousWasNumber = true; 
        } 
        else if (!char.IsLetter(token[i])) 
        { 
         stringBuilder.Append(token[i]); 
         previousWasSeperator = true; 
        } 
        else if ((previousWasNumber && !ignoreNumber) || previousWasSeperator) 
        { 
         stringBuilder.Append(char.ToUpper(token[i])); 
         previousWasSeperator = false; 
         previousWasNumber = false; 
        } 
        else if (i == 0) 
        { 
         ignoreNumber = true; 
         stringBuilder.Append(char.ToUpper(token[i])); 
        } 
        else 
        { 
         ignoreNumber = true; 
         stringBuilder.Append(char.ToLower(token[i])); 
        } 
       } 
       stringBuilder.Append(" "); 
      } 
     } 
     return stringBuilder.ToString().TrimEnd(); 
    } 
} 
関連する問題