前回のセクションで文字列プレースホルダーの2つの記述手法を学びました。実はこの2種類以外にも、C#にはより複雑な書式設定ルールに対応した記法が用意されています。
基本的な書式プレースホルダー文法
{インデックス,配置指定:書式指定子}
1、index(インデックス)
インデックス / 文字列補間変数、必須項目
従来の数値インデックス型プレースホルダー:Console.WriteLine(“{0}”, 123); と記述すると、{0}の箇所に123の値が挿入されます
文字列補間構文 $"":数値によるインデックスが不要で変数名を直接記載可能。例:Console.WriteLine($”Tom is {age} years old”)
実装サンプル
int money = 1000;
Console.WriteLine("元の値:{0}", money);
Console.WriteLine("通貨書式:{0:C}", money);
Console.WriteLine("10文字幅右寄せ通貨:|{0,10:C}|", money);Code language: JavaScript (javascript)
元の値:1000
通貨書式:$1,000.00
10文字幅右寄せ通貨:| $1,000.00|
文字列補間による同等記述
int money = 500;
Console.WriteLine($"元の値:{money}");
Console.WriteLine($"通貨書式:{money:C}");
Console.WriteLine($"10文字幅右寄せ通貨:|{money,10:C}|");Code language: JavaScript (javascript)
2、alignment(配置指定)
配置指定子、省略可能、カンマ , で区切って記述
役割:出力時の最小文字幅と左右の寄せ位置を制御する
例:Console.WriteLine(“{0,10}”, 123); // 合計10文字分の幅を確保し、数値は右寄せで表示

出力結果を確認すると123の左側に空白が複数出力されています。ここの10は全体で10文字幅を確保するという意味で、123の左に7文字分の空白が補完され右寄せになる仕組みです。
正の数:右寄せ、幅が足りない場合左側に空白を補完 例:{0,10} → 10文字幅、数値右寄せ
負の数:左寄せ、幅が足りない場合右側に空白を補完 例:{0,-10} → 10文字幅、数値左寄せ
記述を変更して動作を確認します
Console.WriteLine("{0,-10}", 123); // 10文字幅を占有、負数指定のため数値が左寄せになるCode language: JavaScript (javascript)

空白の有無が視認しにくいため、前後に縦線を追加して区別します
Console.WriteLine("|{0,-10}|", 123);
Console.WriteLine("|{0,10}|", 456);Code language: JavaScript (javascript)

前後を縦線で囲むことで動作が一目で分かります。10は固定の10文字幅を意味し、負数が左寄せ、正数が右寄せ、不足した文字分は空白で埋められます。
文字列補間を使用した同等のコードは下記の通りです
int one = 123;
int two = 456;
Console.WriteLine($"|{one,-10}|");
Console.WriteLine($"|{two,-10}|");Code language: JavaScript (javascript)

3、format(書式指定子)
書式フィールド、省略可能、コロン : で前半要素と区切る
数値の表示形式を制御:通貨、固定小数、指数表記、16進数など
書式フィールドの構文 :Axx
:プレースホルダーと空白なしで連結する必要がありますA:1文字の書式識別子(標準で9種類実装、一部大文字小文字で動作が異なる)xx:精度指定子(省略可、1~2桁の数値。意味は書式文字によって変化)
// F4:固定小数形式、小数4桁まで表示
Console.WriteLine("{0:F4}", 12.345678);
// 文字列補間による同等記述
Console.WriteLine($"{12.345678:F4}");Code language: JavaScript (javascript)

続けて実装例を確認します
double myDouble = 12.345678;
Console.WriteLine("{0,-10:G} -- 汎用書式", myDouble); // 12.345678 -- 汎用書式
Console.WriteLine("{0,-10} -- 既定書式", myDouble); // 12.345678 -- 既定書式
Console.WriteLine("{0,-10:F4} -- 固定小数", myDouble); // 12.3457 -- 固定小数
Console.WriteLine("{0,-10:C} -- 通貨", myDouble); // $12.35 -- 通貨
Console.WriteLine("{0,-10:E3} -- 指数表記", myDouble);//1.235E+001 -- 指数表記
Console.WriteLine("{0,-10:x} -- 16進整数", 1194719); // 123adf -- 16進整数Code language: JavaScript (javascript)
9種類の標準数値書式指定子 対照表
| 識別子 | 正式名称 | 機能 | 精度指定の意味 | 出力例 |
|---|---|---|---|---|
| C/c | Currency 通貨 | ロケール対応の通貨記号を付加して表示 | 小数桁数 | {0:C} 12.5 → $12.50 |
| D/d | Decimal 10進整数 | int型専用、桁数不足時先頭に0を補完 | 最低表示桁数 | {0:D4} 12 → 0012 |
| F/f | Fixed-point 固定小数 | 小数桁数を固定して表示 | 保持する小数桁数 | {0:F4} 12.345678 →12.3457 |
| G/g | General 汎用書式 | 固定小数/指数表記を自動切替、標準の既定書式 | 有効数字桁数 | {0:G4} 12.345678 →12.35 |
| X/x | Hexadecimal 16進数(大小文字区別) | 16進数出力、Xは大文字/xは小文字 | 最低表示桁数 | {0:x} 180026 → 2bf3a |
| N/n | Number 桁区切り数値 | 3桁ごとに区切り記号を挿入 | 小数桁数 | {0:N2} 12345678.54321 →12,345,678.54 |
| P/p | Percent パーセント | 数値×100後に%記号を付加 | 小数桁数 | {0:P2} 0.1221897 →12.22 % |
| R/r | Round-trip 完全復元書式 | 書式化後、精度損失なく元の数値に復元可能 | 精度指定は無視 | {0:R} 1234.21897 →1234.21897 |
| E/e | Scientific 指数表記(大小文字区別) | 指数形式で出力、E大文字/e小文字 | 仮数部の小数桁数 | {0:e4}12.3456789 →1.2346e+001 |
数値書式文字列について