【C#】全角文字を含む場合のPadLeft/PadRight

C#

string.PadLeft/PadRight で文字の右寄せ/左寄せを使用としたとき、文字列に全角があると思うように位置合わせができません。今回は、このような場合に役に立ちそうなサンプルコードを紹介します。

サンプルコード

紹介する処理は★印が付けてある MultiBytePadLeft() メソッドです。Main処理では、4種類の文字列に対して、string.PadLeftを使用した場合と、MultiBytePadLeftを使用した場合の両方をコンソールに出力し、表示を比較しています。

using System;
using System.Text;

class Program
{
    static void Main()
    {
        int area = 10;
        string str1 = "abcdefg";
        string str2 = "あいうえ";
        string str3 = "アイウエオ";
        string str4 = "あいウエお";

        Console.WriteLine("単純なPadLeft()");
        Console.WriteLine(str1.PadLeft(area));
        Console.WriteLine(str2.PadLeft(area));
        Console.WriteLine(str3.PadLeft(area));
        Console.WriteLine(str4.PadLeft(area));

        Console.WriteLine();

        Console.WriteLine("マルチバイト文字を考慮");
        Console.WriteLine(MultiBytePadLeft(str1, area));
        Console.WriteLine(MultiBytePadLeft(str2, area));
        Console.WriteLine(MultiBytePadLeft(str3, area));
        Console.WriteLine(MultiBytePadLeft(str4, area));
    }

    // ★マルチバイト文字を考慮したメソッド
    static string MultiBytePadLeft(string inputString, int targetLength)
    {
        // マルチバイト文字の文字数を取得
        int multiByteCharNum = Encoding.GetEncoding(932).GetByteCount(inputString) - inputString.Length;

        // 文字列長さをマルチバイト文字の文字数分減らす
        return inputString.PadLeft(targetLength - multiByteCharNum);
    }
}

実行結果
PadLeftで右詰め表示をする場合、マルチバイト文字を考慮しないとレイアウトが崩れる(上側)
マルチバイト文字を考慮したメソッドでは、どの文字列も10文字分の領域で右詰めとなる(下側)

解説

// マルチバイト文字の文字数を取得
int multiByteCharNum = Encoding.GetEncoding(932).GetByteCount(inputString) - inputString.Length;

Encoding.GetEncoding(932)はSJISエンコーディングです。このエンコーディングをつかうと、全角は2バイト、アルファベットは1バイト、半角カナも1バイトと扱われるようです。

それに対して、inputString.Lengthは、半角全角問わず1文字と扱います。

上記ふたつの差をとることで、画面表示上では半角2文字分である全角文字の文字数を算出できます。

// 文字列長さをマルチバイト文字の文字数分減らす
return inputString.PadLeft(targetLength - multiByteCharNum);

PadLeftメソッドは、全角半角問わず文字数を数えて挿入するスペースを決めているようです。このため、全角が混じった文字列をPadLeft/PadRightに使用すると、文字列のレイアウトが崩れます。

今回は、処理対象の文字列に全角文字が含まれている場合、全角文字数分、PadLeftに渡す文字数を減らしています。このようにすることで、文字列のレイアウトを合わせることができます。

タイトルとURLをコピーしました