文字列内のアルファベットを小文字から大文字に変換する(例えば、「abc」を「ABC」に)には、String.ToUpperメソッドを、大文字から小文字に変換する(例えば、「ABC」を「abc」に)には、String.ToLowerメソッドを使用します。
ToUpperとToLowerメソッドは、パラメータなしで呼び出すと、現在のカルチャを使用して変換を行います。カルチャを指定して変換したいときは、パラメータにCultureInfoを指定します。
.NET Framework 2.0以降では、String.ToUpperInvariantとString.ToLowerInvariantメソッドを使って変換を行うこともできます。これらのメソッドはインバリアントカルチャを使用して変換を行います。
また、1文字だけ変換するのであれば、Char構造体の静的メソッドである、ToUpper、ToLower、ToUpperInvariant、ToLowerInvariantメソッドを使います。
補足:VB.NETでは、UCaseとLCase関数を使っても、ToUpperとToLowerメソッドと同じことができます。
これらのメソッドは半角文字だけでなく、全角文字のアルファベットでも変換を行います。
以下にこれらのメソッドを使用した例を示します。
Dim s As String = "aBcDe" '現在のカルチャを使用して、大文字に変換する Dim upper1 As String = s.ToUpper() 'ABCDE '現在のカルチャを使用して、小文字に変換する Dim lower1 As String = s.ToLower() 'abcde 'インバリアントカルチャを使用して、大文字に変換する Dim upper2 As String = s.ToUpperInvariant() 'インバリアントカルチャを使用して、小文字に変換する Dim lower2 As String = s.ToLowerInvariant()
string s = "aBcDe"; //現在のカルチャを使用して、大文字に変換する string upper1 = s.ToUpper(); //ABCDE //現在のカルチャを使用して、小文字に変換する string lower1 = s.ToLower(); //abcde //インバリアントカルチャを使用して、大文字に変換する string upper2 = s.ToUpperInvariant(); //インバリアントカルチャを使用して、小文字に変換する string lower2 = s.ToLowerInvariant();
ToUpperとToLowerメソッドはパラメータにCultureInfoを渡すことで、カルチャを指定して変換することができます。MSDNの「String.ToUpper メソッド」では、現在のカルチャを使って変換する場合でも、パラメータを指定して呼び出すことを推奨しています。
Dim s As String = "aBcDe" '現在のカルチャを取得する Dim ci As System.Globalization.CultureInfo = _ System.Globalization.CultureInfo.CurrentCulture '現在のカルチャを使用して、大文字に変換する Dim upper1 As String = s.ToUpper(ci) '現在のカルチャを使用して、小文字に変換する Dim lower1 As String = s.ToLower(ci)
string s = "aBcDe"; //現在のカルチャを取得する System.Globalization.CultureInfo ci = System.Globalization.CultureInfo.CurrentCulture; //現在のカルチャを使用して、大文字に変換する string upper1 = s.ToUpper(ci); //現在のカルチャを使用して、小文字に変換する string lower1 = s.ToLower(ci);
アルファベットの大文字、小文字の変換にカルチャが影響するというのは意外に思われるかもしれませんが、トルコ語やアゼリ語など一部のカルチャでは一般的な変換規則とは違った規則で変換されます。そのため、一般的な変換規則で変換するToUpperInvariantやToLowerInvariantメソッドとは違った結果を返す可能性があります。このことについて詳しくはMSDNの「カスタムの大文字と小文字の対応規則および並べ替え規則」で説明されています。
以下に、ToUpperメソッドが予期せぬ結果を返す例を示します。
'トルコ語のカルチャで大文字小文字を区別しないで比較する Dim ci As New System.Globalization.CultureInfo("tr-TR") If "basic".ToUpper(ci) = "BASIC" Then Console.WriteLine("同じです") Else Console.WriteLine("違います") End If '「違います」と表示される
//トルコ語のカルチャで大文字小文字を区別しないで比較する System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("tr-TR"); if ("basic".ToUpper(ci) == "BASIC") { Console.WriteLine("同じです"); } else { Console.WriteLine("違います"); } //「違います」と表示される
このような予期せぬ結果を回避するには、インバリアントカルチャ(ToUpperInvariantとToLowerInvariantメソッド)を使って変換します。
なお、文字列を大文字と小文字を区別しないで比較する方法は、「2つの文字列が等しいかを調べる」で詳しく説明していますので、そちらをご覧ください。
TextInfoクラスのToUpperとToLowerメソッドを使っても、大文字と小文字の変換を行うことができます。実はStringクラスやChar構造体のToUpperとToLowerメソッドは、TextInfoクラスのToUpperとToLowerメソッドを呼び出しているだけですので、TextInfoのToUpperとToLowerを直接呼び出したほうが速いです。
補足:「C# ToLower Optimization」によると、ASCII文字のアルファベットだけをカルチャに依存せずに大文字から小文字に変換するのであれば、for文で1文字ずつ調べて、大文字ならば32を足すという方法の方がさらに速いそうです。
Dim s As String = "aBcDe" '現在のカルチャのTextInfoを取得する Dim ti As System.Globalization.TextInfo = _ System.Globalization.CultureInfo.CurrentCulture.TextInfo '大文字に変換する Dim upper As String = ti.ToUpper(s) 'ABCDE
string s = "aBcDe"; //現在のカルチャのTextInfoを取得する System.Globalization.TextInfo ti = System.Globalization.CultureInfo.CurrentCulture.TextInfo; //大文字に変換する string upper = ti.ToUpper(s); //ABCDE
TextInfo.ToTitleCaseメソッドを使えば、文字列内に登場する単語の先頭の1文字を大文字にして、残りを小文字にすることができます。なお、どのような場合に大文字になるかという規則は今のところはっきりしていないようですが、文字列の先頭や、スペース文字、コンマ、カンマ等の記号の後では、大文字になるようです。
Dim s As String = "microSoftのvisual basic" Dim ti As System.Globalization.TextInfo = _ System.Globalization.CultureInfo.CurrentCulture.TextInfo '単語の先頭の文字を大文字に、残りを小文字にする Dim s2 As String = ti.ToTitleCase(s) 'Microsoftのvisual Basic
string s = "microSoftのvisual basic"; System.Globalization.TextInfo ti = System.Globalization.CultureInfo.CurrentCulture.TextInfo; //単語の先頭の文字を大文字に、残りを小文字にする string s2 = ti.ToTitleCase(s); //Microsoftのvisual Basic
ある文字が大文字か小文字かを調べるには、Char構造体のIsUpperとIsLowerメソッドを使います。半角全角を問わず、文字がアルファベットの大文字であればIsUpperはTrueを返し、それ以外ではFalseを返します。
以下の例では、文字列内のアルファベットを大文字ならば小文字に、小文字ならば大文字に変換しています。
Dim s As String = "MicroSoftのVisual Basic" 'Char型の配列にする Dim cs As Char() = s.ToCharArray() For i As Integer = 0 To cs.Length - 1 '大文字か調べる If Char.IsUpper(cs(i)) Then '小文字にする cs(i) = Char.ToLower(cs(i)) '小文字か調べる ElseIf Char.IsLower(cs(i)) Then '大文字にする cs(i) = Char.ToUpper(cs(i)) End If Next 'String型にする Dim s2 As New String(cs) '結果を表示 Console.WriteLine(s2) 'mICROsOFTのvISUAL bASIC
string s = "MicroSoftのVisual Basic"; //Char型の配列にする char[] cs = s.ToCharArray(); for (int i = 0; i < cs.Length; i++) { //大文字か調べる if (char.IsUpper(cs[i])) { //小文字にする cs[i] = char.ToLower(cs[i]); } //小文字か調べる else if (char.IsLower(cs[i])) { //大文字にする cs[i] = char.ToUpper(cs[i]); } } //String型にする string s2 = new string(cs); //結果を表示 Console.WriteLine(s2); //mICROsOFTのvISUAL bASIC
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。