書式設定と「桁揃え(アラインメント)」
C#では、ToString()メソッドや文字列補間($)を使い、{value:N0}(カンマ区切り)や{value:F2}(小数点以下2桁)のように、数値の「書式(Format)」を指定できます。
しかし、コンソール出力やテキストレポートを作成する際、書式設定された文字列自体の「全体の幅(桁数)」を固定し、右寄せや左寄せでキレイに揃えたい場合があります。
// 理想の出力(桁が揃っている)
売上: 1,500円
経費: -80円
ToString("N0")だけでは、"1,500"と"-80"のように文字列の長さが異なってしまうため、上記のように揃えることはできません。
このような桁揃え(アラインメント)を実現するために、C#のstring.Formatや文字列補間($)には、「配置指定子(Alignment Specifier)」という構文が用意されています。
配置指定子の構文
配置指定子は、ToString()メソッドでは使用できず、string.Formatまたは文字列補間($)の中でのみ機能します。
書式は {変数名 , 桁数 : 書式} のように、変数名(またはインデックス)と書式(:F2など)の間に、カンマ(,)と桁数を挿入します。
{ 変数名 , [桁数] : [書式] }
[桁数]:- 正の数(例:
10): 全体の幅を10桁とし、右寄せ(左側を空白でパディング)します。 - 負の数(例:
-10): 全体の幅を10桁とし、左寄せ(右側を空白でパディング)します。
- 正の数(例:
文字列補間($)での使用例
C# 6.0以降の文字列補間($)を使用すると、この桁揃えを直感的に記述できます。
コード例1: 右寄せ(正の数)
請求書アイテムの金額リストを、15桁の幅で右寄せして表示する例です。数値自体の書式はC0(通貨、小数点以下0桁)を使用します。
using System;
using System.Globalization;
public class AlignmentExample
{
public static void Main()
{
// 日本のカルチャ(¥ と , のため)
CultureInfo.CurrentCulture = new CultureInfo("ja-JP");
var itemA_Amount = 12800;
var itemB_Amount = 500;
var itemC_Amount = -980; // 割引など
Console.WriteLine("--- 請求書アイテム (右寄せ) ---");
Console.WriteLine("| Item Name | Amount |"); // ヘッダー (15桁幅)
Console.WriteLine("|-----------|-------------|");
// {変数名, 15:C0}
// 15: 全体の幅を15桁で「右寄せ」
// C0: 通貨(小数点以下0桁)でフォーマット
string lineA = $"| Item A | {itemA_Amount,15:C0} |";
string lineB = $"| Item B | {itemB_Amount,15:C0} |";
string lineC = $"| Item C | {itemC_Amount,15:C0} |";
Console.WriteLine(lineA);
Console.WriteLine(lineB);
Console.WriteLine(lineC);
Console.WriteLine("---------------------------------");
}
}
出力結果:
--- 請求書アイテム (右寄せ) ---
| Item Name | Amount |
|-----------|-------------|
| Item A | ¥12,800 |
| Item B | ¥500 |
| Item C | -¥980 |
---------------------------------
¥12,800(7桁)や¥500(4桁)といった長さの異なる文字列が、すべて15桁の幅の中で右側に揃えられていることがわかります。
コード例2: 左寄せ(負の数)
桁数に負の数を指定すると、左寄せになります。
var averageLatency = 15.825;
var maxLatency = 240.1;
Console.WriteLine("\n--- サーバー遅延 (左寄せ) ---");
// {-10:F2}
// -10: 全体の幅を10桁で「左寄せ」
// F2 : 小数点以下2桁でフォーマット
string latency1 = $"平均: {averageLatency,-10:F2} (ms)";
string latency2 = $"最大: {maxLatency,-10:F2} (ms)";
Console.WriteLine(latency1);
Console.WriteLine(latency2);
Console.WriteLine("-----------------------------");
出力結果:
--- サーバー遅延 (左寄せ) ---
平均: 15.83 (ms)
最大: 240.10 (ms)
-----------------------------
15.83と240.10が、10桁の幅の中で左側に揃えられています。
string.Format での使用例
この配置指定子は、string.Formatでも同様に使用できます。変数の代わりにインデックス({0}、{1}など)を使用する点が異なります。
int invoiceTotal = 54321;
double averageCost = 128.75;
// {0,12:N0}
// 0: 最初の引数 (invoiceTotal)
// 12: 12桁で右寄せ
// N0: カンマ区切り、小数点以下0桁
string strFormat1 = string.Format("合計金額: {0,12:N0}", invoiceTotal);
// {0,-10:F2}
// 0: 最初の引数 (averageCost)
// -10: 10桁で左寄せ
// F2: 小数点以下2桁
string strFormat2 = string.Format("平均コスト: {0,-10:F2}", averageCost);
Console.WriteLine("\n--- string.Format の例 ---");
Console.WriteLine(strFormat1);
Console.WriteLine(strFormat2);
出力結果:
--- string.Format の例 ---
合計金額: 54,321
平均コスト: 128.75
まとめ
数値の書式設定(N0やF2)に加えて、**配置指定子(,と桁数)**を使用することで、文字列全体の幅を固定し、右寄せ(正の数)または左寄せ(負の数)を実現できます。
この機能はToString()メソッドでは直接サポートされていませんが、string.Formatや、より直感的な文字列補間($)構文内で簡単に利用でき、コンソール出力やレポートの可読性を高めるために非常に有効です。
