C# で数値をフォーマットされた文字列に変換する
数値をフォーマットされた文字列に変換する
int、double、decimal などの数値型の値を、小数点以下なし、小数第二位まで等、フォーマットされた文字列に変換したい時ありますよね。
ここでは、数値を文字列に変換する際に良く使うフォーマットの例を書いておこうと思います。
今回はサンプルとして Decimal 型の値を文字列に変換する例を載せておきます。
スタンダードフォーマット文字列とは?
スタンダードフォーマット文字列はアルファベット 1 文字で定義されている、標準の書式指定文字列です。
スタンダードフォーマット文字列の代表的なものには、次の 3 つがあります。
- F: 固定小数点
- N: 桁区切り記号つき
- C: 通貨
使う時は [スタンダードフォーマット文字列] のみ、または、[スタンダードフォーマット文字列][精度指定子] のように指定します。
精度指定子は小数点以下の桁数で 0 ~ 99 までの数字が指定でき、F、N、C は指定しなかった場合デフォルトは 2 になります。
例えば、固定小数点の小数点以下なしにしたい場合は F0 で、小数点第二位までにしたい場合は F2 のように指定します。
元の数値の小数点以下の数字が指定した精度より多い場合、値は四捨五入されます。
カルチャーによって、同じスタンダードフォーマット文字列を指定しても変換後の文字列が変わってくる場合があります。
カスタムフォーマット文字列とは?
カスタムフォーマット文字列では、カスタム数値書式指定子というものを使って、数値のフォーマットを指定することができます。
カスタム数値書式指定子の代表的なものには、次のようなものがあります。
- 0: その桁に数字があればその数字が、なければ 0 が表示される
- #: その桁に数字があればその数字が、なければ表示されない
- ,: 桁区切り記号を入れる
- '文字列': 文字列がそのまま結果に表示される
こちらも元の数値の小数点以下の数字が指定した桁数より多い場合、値は四捨五入されます。
フォーマット文字列を使って数値を文字列に変換する
C# の数値のデータ型には ToString() の他に ToString(String)、 ToString(IFormatProvider)、 ToString(String, IFormatProvider) というオーバーロードメソッドが用意されていて、数値を文字列に変換する際にフォーマットを指定して変換することができます。
String の引数にはスタンダードとカスタムのフォーマット文字列を指定することができます。
プログラムを実行する際の CurrentCulture がわからない場合や、特定のカルチャーの結果を得たい場合は、IFormatProvider の引数に CultureInfo を渡すことでカルチャーを指定することができます。
以下は Decimal.ToString([フォーマット文字列]) を使って、数値をフォーマットされた文字列に変換するサンプルコードです。
実行される場合は、using に以下の二つを追加してください。
using System.Diagnostics;
using System.Globalization;
decimal d = 156256.799m;
Debug.WriteLine(d.ToString("----- スタンダードフォーマット文字列 -----"));
Debug.WriteLine(d.ToString("-- F --"));
Debug.WriteLine(d.ToString("F")); // 156256.80 (default:2)
Debug.WriteLine(d.ToString("F0")); // 156257
Debug.WriteLine(d.ToString("F1")); // 156256.8
Debug.WriteLine(d.ToString("F2")); // 156256.80
Debug.WriteLine(d.ToString("-- N --"));
Debug.WriteLine(d.ToString("N")); // 156,256.80 (default:2)
Debug.WriteLine(d.ToString("N0")); // 156,257
Debug.WriteLine(d.ToString("N1")); // 156,256.8
Debug.WriteLine(d.ToString("N2")); // 156,256.80
Debug.WriteLine(d.ToString("-- C --"));
CultureInfo cultureJP = CultureInfo.CreateSpecificCulture("ja-JP");
Debug.WriteLine(d.ToString("C", cultureJP)); // ¥156,257
CultureInfo cultureUS = CultureInfo.CreateSpecificCulture("en-US");
Debug.WriteLine(d.ToString("C", cultureUS)); // $156,256.80
Debug.WriteLine(d.ToString("----- カスタムフォーマット文字列 -----"));
Debug.WriteLine(d.ToString("0")); // 156257
Debug.WriteLine(d.ToString("0.00")); // 156256.80
Debug.WriteLine(d.ToString("#.##")); // 156256.8
Debug.WriteLine(d.ToString("#,0.00")); // 156,256.80
Debug.WriteLine(d.ToString("0,0'円'")); // 156,257円
また、String.Format メソッドでもフォーマット文字列を使うことができます。
decimal d = 156256.799m;
Debug.WriteLine(string.Format("{0:F0}", d)); // 156257
Debug.WriteLine(string.Format("{0:F2}", d)); // 156256.80
Debug.WriteLine(string.Format("{0:0}", d)); // 156257
Debug.WriteLine(string.Format("{0:#.##}", d)); // 156256.8
数値を切り上げ・切り捨てして文字列に変換する
フォーマット文字列を使った方法は、指定した桁に四捨五入されて文字列に変換されます。
切り上げ・切り捨てしたい場合は、文字列に変換する前に、先に数値を切り上げ・切り捨てする必要があります。
小数点以下切り上げ、小数点以下切り捨て、小数点第二位で切り上げ、小数点第二位で切り捨てするサンプルコードを載せておきます。
decimal d = 156256.799m;
decimal d1RoundUp = Math.Ceiling(d);
Debug.WriteLine(d1RoundUp.ToString("F0")); // 156257
decimal d1RoundDown = Math.Floor(d);
Debug.WriteLine(d1RoundDown.ToString("F0")); // 156256
decimal d2RoundUp = Math.Ceiling(d * 100) / 100;
Debug.WriteLine(d2RoundUp.ToString("F2")); // 156256.80
decimal d2RoundDown = Math.Floor(d * 100) / 100;
Debug.WriteLine(d2RoundDown.ToString("F2")); // 156256.79
切り上げの時は Math.Ceiling、切り捨ての時は Math.Floor を使います。
小数点以下切り上げ・切り捨てしたい時は Math.Ceiling・Math.Floor を使い、数値を切り上げ・切り捨てしてから変換すれば OK です。
それ以外の時は、数値を切り上げ・切り下げの後で残したい桁が整数部の一の位になるようにしてから、Math.Ceiling・Math.Floor を使い、その後最初かけた値と同じ値で割ることによって元に戻しています。
以上、C# で数値をフォーマットされた文字列に変換する方法でした。