数値の書式設定(フォーマット)
C#で数値をToString()メソッドを使って文字列に変換する際、単に値を文字列にするだけでなく、「000123のように0で桁を埋めたい」や「1,234,567のように3桁区切りのカンマを付けたい」、「小数点以下3桁まで表示したい」といった、表示形式を整えたい場合があります。
ToString()メソッドは、引数に「書式指定文字列」を渡すことで、これらの要求に柔軟に応えることができます。
この記事では、C#における数値の書式指定を「標準の書式指定子」と「カスタム書式指定子」の2つのカテゴリに分けて解説します。
標準数値書式指定子
標準の書式指定子は、"N"や"D"のような単一のアルファベット文字で、一般的な書式(通貨、10進数、16進数、パーセントなど)を簡単に指定するためのものです。
| 指定子 | 名称 | 説明と例 (例: 1234.5) |
D | 10進数 (Decimal) | 整数専用。"D5" のように桁数を指定すると、0でパディング(01234)されます。 |
F | 固定小数点 | 小数点以下の桁数を固定します。"F3" と指定すると 1234.500 となります。 |
N | 数値 (Number) | 1,234.50 のように、3桁区切りのカンマと小数点以下(デフォルト2桁)を付与します。"N0"で小数点以下0桁にできます。 |
C | 通貨 (Currency) | ¥1,234 のように、カルチャ(地域設定)に応じた通貨記号と桁区切りを付与します。"C0"で小数点以下0桁にできます。 |
E | 指数 (Exponential) | 1.234500E+003 のように、科学的指数表記に変換します。 |
P | パーセント | 値を100倍し、パーセント記号(%)を付与します。1234.5 -> 123,450.00 % |
X | 16進数 | 整数専用。値を16進数に変換します。 |
カスタム数値書式指定子
カスタム書式指定子は、0や#といった記号を組み合わせて、より詳細で柔軟な書式を定義するためのものです。
| 記号 | 名称 | 説明 |
0 | ゼロプレースホルダー | 対応する位置に数値が存在しない場合、0で埋めます(パディング)。 |
# | 数字プレースホルダー | 対応する位置に数値が存在する場合のみ表示し、存在しない場合は何も表示しません。 |
. | 小数点 | 小数点の位置を指定します。 |
, | 桁区切り | 3桁区切り(カンマ)を指定します。(.の手前に置く必要があります) |
0 と # の違い(0埋め)
0 と # の違いは、数値が指定した桁数に満たない場合の「0埋め」の有無です。
int shortId = 123;
// "00000" : 5桁に満たない部分を 0 で埋める
string formatZero = shortId.ToString("00000");
// 結果: "00123"
// "#####" : 5桁を指定するが、# は 0 を強制しない
string formatHash = shortId.ToString("#####");
// 結果: "123"
カンマ区切りと小数点以下の制御
#,0 のパターンは、0の位(1の位)までを必ず表示し、それより上の桁を3桁区切り(#)にする、という定番の書式です。
long largeAmount = 1234567890;
double preciseValue = 12345.6;
// "#,0" : 整数部分を3桁区切りにする
string formatComma = largeAmount.ToString("#,0");
// 結果: "1,234,567,890"
// "#,0.00" : 3桁区切りにし、小数点以下を2桁 (00) で固定する
string formatDecimal = preciseValue.ToString("#,0.00");
// 結果: "12,345.60" (末尾が0でパディングされる)
string.Format と 文字列補間
ToString()メソッドの代わりに、string.Formatメソッドや、より直感的な**文字列補間($)**を使用しても、これらの書式指定子を適用できます。
書式指定は {変数名:書式} のようにコロン(:)の後ろに記述します。
コード例
using System;
using System.Globalization;
public class FormattingExample
{
public static void Main()
{
// カルチャを日本に設定(¥ と , のため)
CultureInfo.CurrentCulture = new CultureInfo("ja-JP");
int orderId = 123;
long totalSales = 2500000;
double accuracy = 0.987654;
Console.WriteLine("--- 標準数値書式 ---");
// D (10進数) : 6桁 0埋め
Console.WriteLine($"注文ID (D6): {orderId.ToString("D6")}");
// N (数値) : 桁区切り (小数点以下0桁)
Console.WriteLine($"売上 (N0): {totalSales.ToString("N0")}");
// C (通貨) : 通貨記号
Console.WriteLine($"売上 (C0): {totalSales.ToString("C0")}");
// F (固定小数点) : 小数点以下3桁
Console.WriteLine($"精度 (F3): {accuracy.ToString("F3")}");
// P (パーセント) : 小数点以下1桁
Console.WriteLine($"精度 (P1): {accuracy.ToString("P1")}");
Console.WriteLine("\n--- カスタム数値書式 ---");
// 0 (ゼロプレースホルダー)
Console.WriteLine($"カスタム0埋め: {orderId.ToString("000000")}");
// #,0 (カスタム桁区切り)
Console.WriteLine($"カスタム桁区切り: {totalSales.ToString("#,0")}");
// #,0.000 (桁区切り + 小数点固定)
Console.WriteLine($"カスタム小数点: {accuracy.ToString("#.000")}");
Console.WriteLine("\n--- 文字列補間 ---");
// string.Format や ToString() の代わりに、文字列補間($)を使う
string summary = $"ID: {orderId:D6} の売上は {totalSales:C0} です。";
Console.WriteLine(summary);
}
}
出力結果:
--- 標準数値書式 ---
注文ID (D6): 000123
売上 (N0): 2,500,000
売上 (C0): ¥2,500,000
精度 (F3): 0.988
精度 (P1): 98.8%
--- カスタム数値書式 ---
カスタム0埋め: 000123
カスタム桁区切り: 2,500,000
カスタム小数点: .988
--- 文字列補間 ---
ID: 000123 の売上は ¥2,500,000 です。
まとめ
数値を文字列に変換する際、ToString()メソッドに書式指定子を渡すことで、表示形式を細かく制御できます。
- 標準書式 (
"N","C","D5"など): 一般的な要件(通貨、0埋め)を素早く満たします。 - カスタム書式 (
"#,0.00"など): 桁区切りや0埋め、小数点以下の桁数を組み合わせて、独自の書式を定義できます。
これらの書式指定は、string.Formatや文字列補間($)でも同様に利用でき、C#でのUI表示やログ出力において不可欠な機能です。
