数値を文字列に変換する方法は「文字列を数値に変換する、数値を文字列に変換する」で説明しました。ここでは、書式(フォーマット)を指定して数値を文字列に変換する方法を説明します。
ToStringメソッドを使えば数値を文字列に変換できますが、その時どのような文字列に変換するかを書式で指定することが出来ます。書式には、文字列を使用します。この文字列を「書式指定文字列」と呼びます。数値を文字列に変換する時に使用される書式指定文字列には、「標準の数値書式指定文字列」と「カスタム数値書式指定文字列」の2種類があります。
標準の数値書式指定文字列は、アルファベット一文字、あるいは、アルファベット一文字と数字から成ります。例えば、通貨に使用される書式は"C"ですが、この書式で 10000 を文字列に変換すると、"\10,000"という文字列になります。
カスタム数値書式指定文字列は、複数の文字列を組み合わせて使用することができ、より柔軟な書式指定が可能です。例えば、"#,0"という書式を使うと、3桁ごとにコンマが入った文字列に変換できます。
Dim num As Integer = 10000 Console.WriteLine(num.ToString("C")) '\10,000 Console.WriteLine(num.ToString("#,0")) '10,000
int num = 10000; Console.WriteLine(num.ToString("C")); //\10,000 Console.WriteLine(num.ToString("#,0")); //10,000
このような数値書式指定文字列については下で詳しく説明しますが、MSDNでは次のようなページで説明されています。これらのページも参考にしてください。
ここからは、数値書式指定文字列の説明とその例を表にして紹介します。
ここで紹介している「例」は、= より前が書式を指定してToStringメソッドを呼び出すコードで、= より後がToStringが返す結果です。リテラル文字列の書き方は、VB.NETになっています。C#の場合は、@ をリテラル文字列の前につければ同じになります。また、結果はカレントカルチャが"ja-JP"の時のものです。別のカルチャ(NumberFormatInfo)では別の結果になる可能性があります。
標準の数値書式指定文字列は、一つのアルファベットと、数字から成ります。アルファベットの部分を「書式指定子」、数字の部分を「精度指定子」と呼びます。
書式指定子 | 名前 | 説明 | 例 |
---|---|---|---|
C または c | 通貨 | 通貨記号と、必要に応じて桁区切り記号が入る 精度指定子は小数部の桁数 既定の精度指定子はカルチャによって異なる | (10000).ToString("C") = "\10,000" (-100.5).ToString("C") = "-\101" (12345.5555).ToString("C2") = "\12,345.56" |
D または d | 10 進数 | 整数型のみサポート 精度指定子は最小桁数 最小桁数に満たない場合は左側に0が挿入される | (12345).ToString("D") = "12345" (12345).ToString("D8") = "00012345" (-12345).ToString("D6") = "-012345" (12345).ToString("D4") = "12345" |
E または e | 指数 | 書式指定子が小文字の時は指数部前の文字も"e"になる 精度指定子は小数部の桁数 既定の精度指定子は6 | (123.456).ToString("E") = "1.234560E+002" (0.0).ToString("e") = "0.000000e+000" (-123.45).ToString("E8") = "-1.23450000E+002" (0.12345).ToString("E3") = "1.235E-001" |
"F" または "f" | 固定小数点 | 精度指定子は小数部の桁数 既定の精度指定子はカルチャによって異なる | (123.456).ToString("F") = "123.46" (1).ToString("F") = "1.00" (-123.456789).ToString("F4") = "-123.4568" (0.1).ToString("F6") = "0.100000" |
"G" または "g" | 一般 | 精度指定子は有効桁数 既定の精度指定子は数値型によって異なる | (123456).ToString("G") = "123456" (0.00001).ToString("G") = "1E-05" (-0.00001).ToString("g") = "-1e-05" (123456).ToString("G4") = "1.235E+05" (-123.456).ToString("G4") = "-123.5" (0.0).ToString("G4") = "0" |
"N" または "n" | 数値 | 必要に応じて桁区切り記号が入る 精度指定子は小数部の桁数 既定の精度指定子はカルチャによって異なる | (1234.56789).ToString("N") = "1,234.57" (10000).ToString("N") = "10,000.00" (-1234.56789).ToString("n4") = "-1,234.5679" |
P または p | パーセント | 数値に100を掛けてパーセント記号を付ける 精度指定子は小数部の桁数 既定の精度指定子はカルチャによって異なる | (1).ToString("P") = "100.00%" (-0.123456789).ToString("p") = "-12.35%" (100).ToString("P") = "10,000.00%" (0.00001).ToString("P") = "0.00%" (0.123456789).ToString("P4") = "12.3457%" (0.125).ToString("P0") = "13%" |
R または r | ラウンドトリップ | 数値の変換後の文字列が、変換前の数値へ戻るように解析される Single 型、Double 型、BigInteger 型でだけサポート 精度指定子は無視される | (123456789.123456789).ToString("R") = "123456789.12345679" (-123456789.123456789).ToString("R") = "-123456789.12345679" |
X または x | 16進数 | 整数型のみサポート 書式指定子が大文字の時は大文字、小文字の時は小文字になる 精度指定子は最小桁数 最小桁数に満たない場合は左側に0が挿入される | (10).ToString("X") = "A" (-1).ToString("x") = "ffffffff" (10).ToString("X4") = "000A" |
その他の 1 文字 | 未定義の指定子 | 実行時に FormatException をスロー |
カスタム数値書式指定文字列は、以下の書式指定子の組み合わせになります。
書式指定子 | 名前 | 説明 | 例 |
---|---|---|---|
0 | ゼロ プレースホルダー | 対応する数字で0を置き換える 対応する数字がない時は0が表示 | (123).ToString("00000") = "00123" (-1.2).ToString("00.00") = "-01.20" (123.456).ToString("00.00") = "123.46" (123.456).ToString("0") = "123" |
# | 桁プレースホルダー | 対応する数字で#を置き換える 対応する数字がない時は表示されない | (123).ToString("#####") = "123" (123.456).ToString("#") = "123" (-123).ToString("#####") = "-123" (0.123456).ToString("#.####") = ".1235" |
. | 小数点 | 小数点の位置を決める 小数点の記号はカルチャによって異なる | (123.456).ToString("0.00") = "123.46" (1.23456).ToString("0.0.0") = "1.23" |
, | 桁区切り記号および数値の位取り | 0 または # の間にコンマがある時は、桁区切り記号が入る 区切り記号と区切られる桁数はカルチャによって異なる 小数点のすぐ左にコンマがある時は、コンマ1つにつき数値が1000で除算される | (123456789).ToString("#,0") = "123,456,789" (123456789).ToString("0,") = "123457" (123456789).ToString("0,,") = "123" (123456789.12).ToString("0,.###") = "123,456.789" (1).ToString("0,0,0") = "001" (1000).ToString("0,0,0") = "1,000" |
% | パーセント プレースホルダー | 数値に 100 を乗算し、パーセント記号を付ける パーセント記号はカルチャによって異なる | (0.123456).ToString("0.00%") = "12.35%" (0.123456).ToString("%0.00") = "%12.35" |
‰ | パーミル プレースホルダー | 数値に 1000 を乗算し、パーミル記号を付ける パーミル記号はカルチャによって異なる | (0.123456).ToString("0.00‰") = "123.46‰" (0.123456).ToString("‰0.00") = "‰123.46" |
E0 E+0 E-0 e0 e+0 e-0 | 指数表記 | 指数表記を使用する 0の数で指数部の最小桁数が決まる | (12.345).ToString("0.00E0") = "1.23E1" (12.345).ToString("0.00e00") = "1.23e01" (12.345).ToString("0.00E+0") = "1.23E+1" (12.345).ToString("0.00E-0") = "1.23E1" (0.12345).ToString("0.00E0") = "1.23E-1" (0.12345).ToString("0.00E+0") = "1.23E-1" (0.12345).ToString("0.00E-0") = "1.23E-1" |
\ | エスケープ文字 | 書式指定子の前に付けるとリテラルとして解釈される | (12.345).ToString("\\0.##\#") = "\12.35#" |
'string' "string" | リテラル文字列区切り記号 | シングルクォートまたはダブルクオートで囲まれた文字列はそのままコピーされる | (12.345).ToString("0.##('0.##')") = "12.35(0.##)" (12.345).ToString("0.##(""0.##"")") = "12.35(0.##)" |
; | セクション区切り記号 | 数値が正の値、負の値、ゼロの時で書式を変えたい場合に使用する 2つの書式をセミコロンで区切ると、はじめの書式は正の値とゼロ、2番目の書式は負の値に適用される 3つの書式をセミコロンで区切ると、はじめの書式は正の値、2番目の書式は負の値、3番目の書式はゼロに適用される 負の値にマイナス記号が付かないため、マイナス記号を付けるなら書式内に記述する | (10).ToString("000;[000]") = "010" (-10).ToString("000;[000]") = "[010]" (0).ToString("000;[000]") = "000" (10).ToString("000;[000];Zero") = "010" (-10).ToString("000;[000];Zero") = "[010]" (0).ToString("000;[000];Zero") = "Zero" |
その他 | 上記以外のすべての文字 | 文字がそのままコピーされる | (10).ToString("0個") = "10個" (1234).ToString("0あ0い0う0え0お0") = "0あ0い1う2え3お4" |
前に触れたように、数値書式指定文字列の中には、カルチャによって結果の変わるものも多くあります。数値型(IFormattableインターフェイスを実装する型)のToStringメソッドにはパラメータとしてIFormatProviderを指定することもできますが、これを指定しなかった場合は、現在のカルチャが使用されます。
以下に、IFormatProviderを指定してToStringメソッドを呼び出す例を示します。
'カルチャを en-US にして通貨書式で文字列にする Dim ci As New System.Globalization.CultureInfo("en-US") Console.WriteLine((10000).ToString("C", ci)) '$10,000.00
//カルチャを en-US にして通貨書式で文字列にする System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("en-US"); Console.WriteLine((10000).ToString("C", ci)); //$10,000.00
数値書式指定文字列はString.Formatメソッドで使用することもできます。String.Formatメソッドの使い方は、ぐだぐだ説明するよりも、具体例を見たほうが分かりやすいと思いますので、以下に幾つかの例を示します。
Dim s1 As String = String.Format("{0}円の商品を{1}個買う", 1000, 12) '1000円の商品を12個買う Dim s2 As String = String.Format("{0:C}円の商品を{1:000}個買う", 1000, 12) '\1,000円の商品を012個買う Dim s3 As String = String.Format("{0,9:C}円の商品を{1,-9:000}個買う", 1000, 12) ' \1,000円の商品を012 個買う Dim s4 As String = String.Format("{0,9}円の商品を{1,-9}個買う", 1000, 12) ' 1000円の商品を12 個買う
string s1 = string.Format("{0}円の商品を{1}個買う", 1000, 12); //1000円の商品を12個買う string s2 = string.Format("{0:C}円の商品を{1:000}個買う", 1000, 12); //\1,000円の商品を012個買う string s3 = string.Format("{0,9:C}円の商品を{1,-9:000}個買う", 1000, 12); // \1,000円の商品を012 個買う string s4 = string.Format("{0,9}円の商品を{1,-9}個買う", 1000, 12); // 1000円の商品を12 個買う
一番目の例では、書式を指定せずに、2つの数値を定型文の中に埋め込んでいます。{(数字)} の部分に、その後に指定されたパラメータの値が文字列に変換されて埋め込まれます。{ } 内の数字は、言うまでもなく、そこに埋め込むパラメータの番号(一番初めが0)です。この例では2つの値だけを埋め込みましたが、何個でも構いません。
2番目の例では、書式を指定しています。{ } 内で、番号に続けてコロンと書式を記述します。
3番目の例では、書式と、さらに最小幅を指定しています。最小幅よりそこに埋め込まれる文字列が小さいと、最小幅になるように、その文字列の左側にスペース文字が挿入されます。最小幅に負の数を指定した時は、右側にスペースが挿入されます。
4番目の例は、書式を指定せずに、最小幅だけを指定した例です。
このような機能は、「複合書式指定機能」と呼ばれています。複合書式指定機能についてより詳しくは、MSDNの「複合書式設定」をご覧ください。
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。