C#(.NET)の書式指定
C#(.NET)において数値、日時等を書式を指定して文字列に変換(整形、フォーマット)する方法を整理します。
書式はカルチャに依存する為、実行環境のカルチャによって結果が異なります。
以下の例は日本語環境(ja-JP
)で動作確認しました。
書式の指定方法
書式(フォーマット文字列)を指定して文字列への変換を行う方法はいくつかあります。
string.Format
メソッド
代表的な方法はstring.Format
メソッドを使用するものです。
フォーマット文字列を定数に定義して共有する等、応用がしやすくなります。
string.Format("{0:N2}", 1234.56); // 1,234.56
ToString
メソッド
一部の組込型ではToString
メソッドの引数に書式文字列を指定することが出来ます。
単一の値やオブジェクトを文字列に変換する場合に使用できます。
(1234.56).ToString("N2"); // 1,234.56
文字列補間式
C# 6 で導入された文字列挿入($""
)を使用すると、リテラルのように文字列整形を記述することが出来ます。
フォーマット文字列を定数等で共有する必要が無い場合や、カルチャ指定が不要な場合には特に簡単に記述できます。
$"{1234.56:N2}"; // 1,234.56
書式設定の種類
以下、書式設定の方法を簡単に紹介しています。
より詳細には後で紹介するMicrosoftの公式ドキュメント等をご参照ください。
書式指定無し
書式を指定しない場合(単にToString
メソッドを使用する場合等)、型に応じた一般的な書式で文字列に変換されます。
多くの組込型では、後述の標準書式指定子で"G"
と同じ結果となります。
標準書式指定子
一般的に使用される書式を指定することが出来ます。
アルファベット1文字の書式指定子と、0~99の範囲で指定する精度指定子の組み合わせで書式を表現します。
書式指定子は 数値("N"
)、通貨("C"
) 等書式の種類を指定し、精度指定子は書式指定子によって小数部の桁数や有効桁数等を指定します。
精度指定子を省略した場合は書式指定子に応じた既定値が指定されたものとされます。
string.Format("{0:N}", 1234.5678); // 1,234.57
string.Format("{0:N1}", 1234.5678); // 1,234.6
string.Format("{0:N2}", 1234.5678); // 1,234.57
string.Format("{0:N3}", 1234.5678); // 1,234.568
カスタム書式指定子
複数のカスタム書式指定子の組み合わせで、標準書式指定子では表現できない開発対象アプリケーションに固有の書式を作成することが出来ます。
string.Format("{0:00000}", 1234.5678); // 01235
string.Format("{0:#,###.##}", 1234.5); // 1,234.5
string.Format("{0:#,###.00}", 1234.5); // 1,234.50
小数部の桁数
数値の小数部の桁数が書式で指定したものより大きい場合、小数部の桁数が書式に収まるように丸められますが、.NET Frameworkでは四捨五入で処理されます。
Math.Round
メソッドが既定では銀行丸め1を行うのとは動作が異なるので注意が必要です。2
string.Format("{0:N3}", 1.2345); // 1.235
string.Format("{0:N3}", Math.Round(1.2345, 3)); // 1.234
カルチャの指定
string.Format
メソッドや一部の組込型のToString
メソッドにはIFormatProvider
オブジェクトを引数にとるオーバーロードが用意されています。
これにカルチャ(CultureInfo
)を渡して任意のカルチャを対象にした書式指定が出来ます。
string.Format(new CultureInfo("ja-JP"), "{0:C}", 1234.56); // ¥1,235
string.Format(new CultureInfo("en-US"), "{0:C}", 1234.56); // $1,234.56
文字列補間式はFormattableString
型の変数に代入することで、カルチャを指定した書式指定ができます。3
FormattableString format = $"{1234.56:C}";
format.ToString(new CultureInfo("ja-JP")); // ¥1,235
format.ToString(new CultureInfo("en-US")); // $1,234.56
この場合、format
変数はFormattableString
型を明示する必要があります。
var
で宣言した場合、単に文字列補完式により整形された文字列(string
)が代入されます。
参考
以下の公式ドキュメントを参考にしました。