【C#】文字列の桁揃え:指定した幅(桁数)で数値を右寄せ・左寄せする方法

目次

書式設定と「桁揃え(アラインメント)」

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.83240.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    

まとめ

数値の書式設定(N0F2)に加えて、**配置指定子(,と桁数)**を使用することで、文字列全体の幅を固定し、右寄せ(正の数)または左寄せ(負の数)を実現できます。

この機能はToString()メソッドでは直接サポートされていませんが、string.Formatや、より直感的な文字列補間($)構文内で簡単に利用でき、コンソール出力やレポートの可読性を高めるために非常に有効です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次