DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

小文字を大文字に、大文字を小文字に変換する

文字列内のアルファベットを小文字から大文字に変換する(例えば、「abc」を「ABC」に)には、String.ToUpperメソッドを、大文字から小文字に変換する(例えば、「ABC」を「abc」に)には、String.ToLowerメソッドを使用します。

ToUpperとToLowerメソッドは、パラメータなしで呼び出すと、現在のカルチャを使用して変換を行います。カルチャを指定して変換したいときは、パラメータにCultureInfoを指定します。

.NET Framework 2.0以降では、String.ToUpperInvariantString.ToLowerInvariantメソッドを使って変換を行うこともできます。これらのメソッドはインバリアントカルチャを使用して変換を行います。

また、1文字だけ変換するのであれば、Char構造体の静的メソッドである、ToUpper、ToLower、ToUpperInvariant、ToLowerInvariantメソッドを使います。

補足:VB.NETでは、UCaseとLCase関数を使っても、ToUpperとToLowerメソッドと同じことができます。

これらのメソッドは半角文字だけでなく、全角文字のアルファベットでも変換を行います。

以下にこれらのメソッドを使用した例を示します。

VB.NET
コードを隠すコードを選択
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()
C#
コードを隠すコードを選択
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 メソッド」では、現在のカルチャを使って変換する場合でも、パラメータを指定して呼び出すことを推奨しています。

VB.NET
コードを隠すコードを選択
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)
C#
コードを隠すコードを選択
string s = "aBcDe";

//現在のカルチャを取得する
System.Globalization.CultureInfo ci =
    System.Globalization.CultureInfo.CurrentCulture;

//現在のカルチャを使用して、大文字に変換する
string upper1 = s.ToUpper(ci);
//現在のカルチャを使用して、小文字に変換する
string lower1 = s.ToLower(ci);

ToUpperとToUpperInvariantメソッドの違い

アルファベットの大文字、小文字の変換にカルチャが影響するというのは意外に思われるかもしれませんが、トルコ語やアゼリ語など一部のカルチャでは一般的な変換規則とは違った規則で変換されます。そのため、一般的な変換規則で変換するToUpperInvariantやToLowerInvariantメソッドとは違った結果を返す可能性があります。このことについて詳しくはMSDNの「カスタムの大文字と小文字の対応規則および並べ替え規則」で説明されています。

以下に、ToUpperメソッドが予期せぬ結果を返す例を示します。

VB.NET
コードを隠すコードを選択
'トルコ語のカルチャで大文字小文字を区別しないで比較する
Dim ci As New System.Globalization.CultureInfo("tr-TR")
If "basic".ToUpper(ci) = "BASIC" Then
    Console.WriteLine("同じです")
Else
    Console.WriteLine("違います")
End If
'「違います」と表示される
C#
コードを隠すコードを選択
//トルコ語のカルチャで大文字小文字を区別しないで比較する
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メソッドを使う

TextInfoクラスのToUpperとToLowerメソッドを使っても、大文字と小文字の変換を行うことができます。実はStringクラスやChar構造体のToUpperとToLowerメソッドは、TextInfoクラスのToUpperとToLowerメソッドを呼び出しているだけですので、TextInfoのToUpperとToLowerを直接呼び出したほうが速いです。

補足:「C# ToLower Optimization」によると、ASCII文字のアルファベットだけをカルチャに依存せずに大文字から小文字に変換するのであれば、for文で1文字ずつ調べて、大文字ならば32を足すという方法の方がさらに速いそうです。
VB.NET
コードを隠すコードを選択
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
C#
コードを隠すコードを選択
string s = "aBcDe";

//現在のカルチャのTextInfoを取得する
System.Globalization.TextInfo ti =
    System.Globalization.CultureInfo.CurrentCulture.TextInfo;

//大文字に変換する
string upper = ti.ToUpper(s);
//ABCDE

初めの1文字だけを大文字にする

TextInfo.ToTitleCaseメソッドを使えば、文字列内に登場する単語の先頭の1文字を大文字にして、残りを小文字にすることができます。なお、どのような場合に大文字になるかという規則は今のところはっきりしていないようですが、文字列の先頭や、スペース文字、コンマ、カンマ等の記号の後では、大文字になるようです。

VB.NET
コードを隠すコードを選択
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
C#
コードを隠すコードを選択
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を返します。

以下の例では、文字列内のアルファベットを大文字ならば小文字に、小文字ならば大文字に変換しています。

VB.NET
コードを隠すコードを選択
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
C#
コードを隠すコードを選択
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

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。