回答:
string s = "THIS IS MY TEXT RIGHT NOW";
s = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());
おそらく、Thread.CurrentThread(System.Threading)よりもCultureInfo(System.Globalization)からToTitleCaseを呼び出す方が好きです。
string s = "THIS IS MY TEXT RIGHT NOW";
s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());
しかし、それはjspcalソリューションと同じでなければなりません
編集
実際、これらのソリューションは同じではありません:CurrentThread
--calls-> CultureInfo
!
System.Threading.Thread.CurrentThread.CurrentCulture
string s = "THIS IS MY TEXT RIGHT NOW";
s = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());
IL_0000: ldstr "THIS IS MY TEXT RIGHT NOW"
IL_0005: stloc.0 // s
IL_0006: call System.Threading.Thread.get_CurrentThread
IL_000B: callvirt System.Threading.Thread.get_CurrentCulture
IL_0010: callvirt System.Globalization.CultureInfo.get_TextInfo
IL_0015: ldloc.0 // s
IL_0016: callvirt System.String.ToLower
IL_001B: callvirt System.Globalization.TextInfo.ToTitleCase
IL_0020: stloc.0 // s
System.Globalization.CultureInfo.CurrentCulture
string s = "THIS IS MY TEXT RIGHT NOW";
s = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());
IL_0000: ldstr "THIS IS MY TEXT RIGHT NOW"
IL_0005: stloc.0 // s
IL_0006: call System.Globalization.CultureInfo.get_CurrentCulture
IL_000B: callvirt System.Globalization.CultureInfo.get_TextInfo
IL_0010: ldloc.0 // s
IL_0011: callvirt System.String.ToLower
IL_0016: callvirt System.Globalization.TextInfo.ToTitleCase
IL_001B: stloc.0 // s
参照:
文字列の最初の文字を大文字に変換する方法はいくつかあります。
最初の方法は、最初の文字をキャップし、サブストリングを使用して残りの文字列を追加するメソッドを作成することです。
public string UppercaseFirst(string s)
{
return char.ToUpper(s[0]) + s.Substring(1);
}
2番目の方法(少し高速です)は、文字列をchar配列に分割してから、文字列を再構築します。
public string UppercaseFirst(string s)
{
char[] a = s.ToCharArray();
a[0] = char.ToUpper(a[0]);
return new string(a);
}
未テストですが、次のようなものが機能するはずです:
var phrase = "THIS IS MY TEXT RIGHT NOW";
var rx = new System.Text.RegularExpressions.Regex(@"(?<=\w)\w");
var newString = rx.Replace(phrase,new MatchEvaluator(m=>m.Value.ToLowerInvariant()));
本質的には、「別の英数字に続く英数字のすべての出現に対して正規表現一致を実行し、それをそれ自体の小文字バージョンに置き換える」
Webページで使用している場合は、CSSを使用することもできます。
style="text-transform:capitalize;"
ASP.NET
は、OPがWEBで実行していることを示します。もちろん、これは問題の答えではありません。OPはソリューションを必要としたためですC#
が、問題を解決し、代替ソリューションになる可能性があります。+1
大きなテーブルを作成するときは速度が問題になるので、Jamie Dixonの2番目の関数が最適ですが、完全には機能しません...
それはすべての文字を小文字にすることに失敗し、文字列の各単語の最初の文字ではなく、文字列の最初の文字のみを大文字にします...以下のオプションは両方の問題を修正します:
public string UppercaseFirstEach(string s)
{
char[] a = s.ToLower().ToCharArray();
for (int i = 0; i < a.Count(); i++ )
{
a[i] = i == 0 || a[i-1] == ' ' ? char.ToUpper(a[i]) : a[i];
}
return new string(a);
}
この時点で、これがまだ最速のオプションであるかどうかは不明ですが、Regex
George Mauerによって提供されたソリューションはより高速になる可能性があります...十分に関心がある人はテストする必要があります。
以下の解決策がjspcalの回答よりも効率が良いかどうかはわかりませんが、JamieやGeorgeの場合よりもオブジェクトの作成が少なくて済みます。
string s = "THIS IS MY TEXT RIGHT NOW";
StringBuilder sb = new StringBuilder(s.Length);
bool capitalize = true;
foreach (char c in s) {
sb.Append(capitalize ? Char.ToUpper(c) : Char.ToLower(c));
capitalize = !Char.IsLetter(c);
}
return sb.ToString();
興味のある可能性のある解決策の1つ。1つのループで文字の配列を右から左に移動し、逆も同様です。
public static string WordsToCapitalLetter(string value)
{
if (string.IsNullOrWhiteSpace(value))
{
throw new ArgumentException("value");
}
int inputValueCharLength = value.Length;
var valueAsCharArray = value.ToCharArray();
int min = 0;
int max = inputValueCharLength - 1;
while (max > min)
{
char left = value[min];
char previousLeft = (min == 0) ? left : value[min - 1];
char right = value[max];
char nextRight = (max == inputValueCharLength - 1) ? right : value[max - 1];
if (char.IsLetter(left) && !char.IsUpper(left) && char.IsWhiteSpace(previousLeft))
{
valueAsCharArray[min] = char.ToUpper(left);
}
if (char.IsLetter(right) && !char.IsUpper(right) && char.IsWhiteSpace(nextRight))
{
valueAsCharArray[max] = char.ToUpper(right);
}
min++;
max--;
}
return new string(valueAsCharArray);
}
文字列拡張子としてのjspcalの回答。
Program.cs
class Program
{
static void Main(string[] args)
{
var myText = "MYTEXT";
Console.WriteLine(myText.ToTitleCase()); //Mytext
}
}
StringExtensions.cs
using System;
public static class StringExtensions
{
public static string ToTitleCase(this string str)
{
if (str == null)
return null;
return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());
}
}