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に渡す文字数を減らしています。このようにすることで、文字列のレイアウトを合わせることができます。
まとめ
本記事では、C#において、文字列に全角文字を含む場合の PadLeft/PadRight の使い方について紹介しました。