string.Formatメソッド

文字列の整形

このページではstring.Formatメソッドの説明を行います。

Console.WriteLineメソッドもここで説明している書式をそのまま使用できます。

文字列操作全般のメソッドについてはstring型のメソッドを参照してください。

複合書式

string.Formatメソッドは第一引数に複合書式という、書式を指定するための文字列を指定します。
第二引数以降には複合書式で使用する値を指定します。


int num1 = 5, num2 = 7;

string s =
    string.Format("変数num1は{0}、変数num2は{1}", num1, num2);

Console.WriteLine(s);
変数num1は5、変数num2は7

複合書式内の{0}は、第二引数に指定された値に置き換えられます。
これをインデックスコンポーネント(インデックス)またはパラメーター指定子といいます。

{1}は第三引数に、{2}は第四引数に…と、数値を増やすことで置き換える値を増やせます。
それ以外の文字列はそのまま出力されます。

Console.WriteLineメソッドはstring.Formatメソッドを使用せずとも複合書式を直接書くことができます。


int num1 = 5, num2 = 7;

Console.WriteLine("変数num1は{0}、変数num2は{1}", num1, num2);

このページでは多少回りくどいですがこの機能は使わずにstring.Formatメソッドによる文字列整形を使用します。

アラインメント(Alignment)

複合書式を以下のようにすると、文字列の右寄せまたは左寄せができます。


int num = 123;

//右寄せ
Console.WriteLine(string.Format("{0,5}", num));

//左寄せ
Console.WriteLine(string.Format("{0,-5}", num));
  123
123  

文字数がコンマ後で指定した数になるように空白が挿入されます。
正数ならば右寄せ、負数なら左寄せとなります。

元の文字列の文字数が指定の数以上の場合はなにもしません。
(文字の切り捨てなどにはならない)

標準書式指定文字列

インデックスの数値後に「:」と特定の文字列を指定すると、文字列を様々な形式に整形できます。

アラインメントと組み合わせる場合はアラインメントを先に記述します。

十進数

「d」「D」を指定すると数値を十進数で表記します。
大文字小文字はどちらでも動作は変わりません。
この書式は整数型にのみ有効です。

「d」「D」に続いて数値をしているすると桁数を指定できます。
足りない分は0で埋められます。


int num = 123;

Console.WriteLine(string.Format("{0:D}", num));
Console.WriteLine(string.Format("{0:D5}", num));
123
00123  

十六進数

「x」「X」を指定すると数値を十進数で表記します。
大文字小文字によって十六進数のアルファベットの大文字小文字が変化します。
この書式は整数型にのみ有効です。

「x8」のように数値を指定すると最小桁数を指定できます。


int num = 12341234;

Console.WriteLine(string.Format("{0:x}", num));
Console.WriteLine(string.Format("{0:X}", num));
Console.WriteLine(string.Format("{0:X8}", num));
bc5ff2
BC4FF2
00BC4FF2

指数

「e」「E」を指定すると指数表示します。
大文字小文字によって指数部の「e」の大文字小文字を指定できます。

「e5」のように数値を指定すると小数部の桁数の指定ができます。


int num = 123;

Console.WriteLine(string.Format("{0:e}", num));
Console.WriteLine(string.Format("{0:e5}", num));
1.230000e+002
1.23000e+002

固定小数点

「f」「F」を指定すると小数を表示します。
大文字小文字で動作は変わりません。

「f5」のように数値を指定すると小数部の桁数の指定ができます。


double num = 1.23;

Console.WriteLine(string.Format("{0:f}", num));
Console.WriteLine(string.Format("{0:f5}", num));
1.23
1.23000

一般

「g」「G」を指定すると固定小数点または指数で表示します。
どちらで表示されるかは指定されたデータ型に応じて自動的に決定されます。
大文字小文字によって指数部の「e」の大文字小文字を指定できます。

「g5」のように数値を指定すると有効最大桁数を指定できます。


int num1 = 1230000000;
double num2 = 0.000000123;

Console.WriteLine(string.Format("{0:g}", num1));
Console.WriteLine(string.Format("{0:g5}", num1));

Console.WriteLine(string.Format("{0:g}", num2));
Console.WriteLine(string.Format("{0:G5}", num2));
1230000000
1.23e+09
1.23e-07
1.23E-07

数値の桁区切り

「n」「N」を指定すると数値を桁区切りで表示します。
大文字小文字で動作は変わりません。

「n5」のように数値を指定すると小数部の桁数の指定ができます。
はみ出した分は丸められます(四捨五入)。


int num1 = 1234567;
double num2 = 1.234567;

Console.WriteLine(string.Format("{0:n}", num1));
Console.WriteLine(string.Format("{0:n0}", num1));
Console.WriteLine(string.Format("{0:n5}", num2));
1,234,567.00
1,234,567
1.23457

その他

その他、使用頻度があまり高くないと思われる書式指定文字列をまとめて説明します。
説明はコード中にコメントで記述します。


int num1 = 123456;
double num2 = 0.123456;

//c C
//通貨
Console.WriteLine(string.Format("{0:c}", num1));
Console.WriteLine(string.Format("{0:c2}", num1));

Console.WriteLine(string.Empty);

//p P
//パーセント
//値を100倍して表示
//数値指定は小数の桁数
//(はみ出した分は丸める)
Console.WriteLine(string.Format("{0:p}", num2));
Console.WriteLine(string.Format("{0:p1}", num2));

Console.WriteLine(string.Empty);

//r R
//ラウンドトリップ
//可能な限り小数の丸めを行わない
//数値指定は無視される
Console.WriteLine(string.Format("{0:r}", 1.0 / 3.0));
//参考:通常の表示
Console.WriteLine(string.Format("{0}", 1.0 / 3.0));
¥123,456
¥123,456.00

12.35%
12.3%

0.33333333333333331
0.333333333333333

カスタム数値書式指定文字列

数値を表示する場合はさらに柔軟にカスタマイズできます。

小数点の位置(.)

任意の位置に「.」を指定することで、小数点の位置を指定できます。
これは後述の「0」や「#」と併用しますので、そちらのサンプルコードを参照してください。

「.」は最初に登場したものだけが有効です。
複数記述しても二つ目以降は無効になります。

桁数指定0詰め(0)

「0」を任意の数指定すると、表示する桁数を指定できます。

整数部の場合は最小桁数を指定できます。
指定の桁数を超える分はそのまま表示され、足りない分は0を表示します。
小数部の場合は指定の桁数を超える値は丸められ、足りない分は0を表示します。


int num1 = 123;
double num2 = 0.345;

//最小1桁
Console.WriteLine(string.Format("{0:0}", num1));
//最小5桁
Console.WriteLine(string.Format("{0:00000}", num1));

//整数部最小1桁、小数部2桁
Console.WriteLine(string.Format("{0:0.00}", num2));
//整数部最小2桁、小数部5桁
Console.WriteLine(string.Format("{0:00.00000}", num2));
123
00123
0.35
00.34500

桁数指定(#)

「#」を任意の数指定すると、表示する桁数を指定できます。
「0」との違いは、省略可能な「0」は表示しないことです。

整数部の場合は最小桁数を指定できます。
指定の桁数を超える分はそのまま表示され、足りない分は何も表示しません。
小数部の場合は指定の桁数を超える値は丸められ、足りない分は何も表示しません。


int num1 = 123;
double num2 = 0.345;

Console.WriteLine(string.Format("{0:#}", num1));
Console.WriteLine(string.Format("{0:#####}", num1));

Console.WriteLine(string.Format("{0:#.##}", num2));
Console.WriteLine(string.Format("{0:#.#####}", num2));
123
123
.35
.345

桁区切り(,)

整数部の「0」または「#」の間に「,」を指定することで、桁区切り表記します。


int num = 12345;

Console.WriteLine(string.Format("{0:#,#}", num));
Console.WriteLine(string.Format("{0:000000,#}", num));
12,345
0,012,345

1000で除算(,)

「,」記号を小数点の手前に記述すると、数値を1000で除算します。
「,」の数を増やす度にさらに1000で除算します。
(2つ書けば1000000で除算)

小数点の手前とは、明示的に記述しているもののほか暗黙的なものも対象になります。
整数値の一番右端には通常は省略されていますがここに小数点が存在するため、一番右端に「,」を指定すれば1000で除算されます。


int num = 123456789;
double real = 1234567.89;

Console.WriteLine(string.Format("{0:#,#}", num));
Console.WriteLine(string.Format("{0:#,#,}", num));
Console.WriteLine(string.Format("{0:#,#,,}", num));

Console.WriteLine();

Console.WriteLine(string.Format("{0:#,#.##}", real));
Console.WriteLine(string.Format("{0:#,#,.##}", real));
Console.WriteLine(string.Format("{0:#,#,,.##}", real));
123,456,789
123,456
123

1,234,567.89
1,234.57
1.23

上記の実行結果は「.」と「,」の違いに注意してください。

100で乗算(%)

「%」を指定すると数値を100で乗算します。
小数値をパーセント表記する場合に使用します。


double real = 0.1234;

Console.WriteLine(string.Format("{0:#%}", real));
Console.WriteLine(string.Format("{0:#.#%}", real));
12%
12.3%

1000で乗算(‰)

「‰」を指定すると数値を1000で乗算します。
この記号は「パーミル」といい、千分率を意味します。
(「%」は百分率)


double real = 0.1234;

Console.WriteLine(string.Format("{0:#‰}", real));
Console.WriteLine(string.Format("{0:#.#‰}", real));
123‰
123.4‰

指数表記(E)

「E」「e」「E+」「e+」「E-」「e-」のいずれかに続いて「0」をひとつ以上記述すると、指数表記します。
大文字小文字は指数を意味する「E」の大文字小文字の指定です。

「E+」は指数部に「+」または「-」を必ず表示します。
「E-」または「E」は指数部が負の場合にのみ「-」を表示します。

「0」の数は指数部の最小桁数を意味します。


double real1 = 123.456;
double real2 = 0.00123456;

Console.WriteLine(string.Format("{0:0.###E0}", real1));
Console.WriteLine(string.Format("{0:0.###E0}", real2));
Console.WriteLine(string.Format("{0:0.###E000}", real1));
Console.WriteLine(string.Format("{0:0.###E000}", real2));

Console.WriteLine();

Console.WriteLine(string.Format("{0:0.###E+0}", real1));
Console.WriteLine(string.Format("{0:0.###E+0}", real2));

Console.WriteLine();

Console.WriteLine(string.Format("{0:0.###E-0}", real1));
Console.WriteLine(string.Format("{0:0.###E-0}", real2));
1.235E2
1.235E-3
1.235E002
1.235E-003

1.235E+2
1.235E-3

1.235E2
1.235E-3

指数表記とは、桁数の多い数値を短く表す記法です。
電卓で大きな値(または極小の値)の計算をすると表示される「E」は指数を意味します。

「E」の後ろの数字は「10のn乗」を意味します。
例えば「1.235E2」ならば「1.235 × 10の2乗」つまり「123.5」となります。

指数がマイナスの場合は「10の-n乗」、つまり「E-1」ならば1/10倍となります。
例えば「1.235E-3」ならば「1.235 × 10の-3乗」つまり「0.001235」となります。

正数/負数/ゼロによる分岐(;)

「;」はやや特殊で、値が正数、負数、0のいずれかにより表示する文字列を分岐します。
セミコロンはそれぞれの文字列の区切り文字として働きます。

セミコロンがひとつの場合、区切りの前が正数またはゼロの時の表記となります。
区切りの後ろが負数の時の表記となります。

セミコロンが二つの場合、区切りの先頭が正数の時の表記となります。
区切りの真ん中が負数の時の表記となります。
最後の区切りがゼロの時の表記となります。


int posi = 5;
int nega = -2;
int zero = 0;

Console.WriteLine(
    string.Format("{0:Plus0;[Minus0]}", posi));
Console.WriteLine(
    string.Format("{0:Plus0;[Minus0]}", nega));
Console.WriteLine(
    string.Format("{0:Plus0;[Minus0]}", zero));

Console.WriteLine();

Console.WriteLine(
    string.Format("{0:Plus0;[Minus0];!Zero!}", posi));
Console.WriteLine(
    string.Format("{0:Plus0;[Minus0];!Zero!}", nega));
Console.WriteLine(
    string.Format("{0:Plus0;[Minus0];!Zero!}", zero));
Plus5
[Minus2]
Plus0

Plus5
[Minus2]
!Zero!

値が負数、かつ書式指定文字列により値が丸められてゼロに変化した場合は変化後の書式で表示されます。


double nega = -0.123;

Console.WriteLine(
    string.Format("{0:Plus0;[Minus0]}", nega));
Console.WriteLine(
    string.Format("{0:Plus0;[Minus0];!Zero!}", nega));
Plus0
!Zero!

エスケープ文字(\)

「\」は書式指定のための文字をエスケープします。
意味としては通常の文字列中のエスケープシーケンスと同じです。
書式指定文字列内の「0」「#」「.」「,」「%」「‰」「E」「e」が対象です。

ただし、「\」記号は通常の文字列のエスケープ文字として働きますから、「\」を2つ重ねるか、エスケープシーケンスの抑制文字(@)を利用します。

エスケープ文字自体をエスケープする場合は「\\\\」と記述します。
(逐語的文字列(@)なら「\\」)


int num = 123;

Console.WriteLine(string.Format("{0:##0}", num));

Console.WriteLine();

Console.WriteLine(string.Format("{0:\\#\\#0}", num));
Console.WriteLine(string.Format(@"{0:\#\#0}", num));

Console.WriteLine();

Console.WriteLine(string.Format("{0:\\\\##0}", num));
Console.WriteLine(string.Format(@"{0:\\##0}", num));
123

##123
##123

¥123
¥123