4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

C#(.NET)の書式指定

Last updated at Posted at 2021-03-28

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)が代入されます。

参考

以下の公式ドキュメントを参考にしました。

  1. 銀行丸め: 端数が5の場合に、丸めた後の末尾の数値が偶数になるように丸める方法。

  2. さらにややこしいことに、.NET Core 2.1以降では銀行丸めに統一されたそうです。この辺り動作確認が取れたら追記する予定です。

  3. @juner 氏にコメントでご指摘頂きました。氏のコメントでも紹介されていますので、是非ご参照ください。

4
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?