メモの日々


2020年12月02日(水) [長年日記]

[c#] C#で浮動小数点の書式設定

C#での浮動小数点(double)の文字列化についてちょっとメモ。

ToString()

浮動小数点はToString()メソッドを使用すると文字列化することができる。このメソッドは、リファレンスによれば

ToString("G", CultureInfo.CurrentCulture)

と同じ挙動をする。Gは標準の数値書式指定文字列である。ただ、Gは値によっては指数表記になってしまうので困ることがある。

> 0.00001.ToString()
"1E-05"

書式指定文字列F

固定小数点表記を使いたい場合はFが使えそうに思うが、これを使うと小数部の桁数が固定になってしまう。末尾に不要なゼロが付くのが嫌なことがある。

> 0.00001.ToString("F6")
"0.000010"

カスタム数値形式文字列

固定小数点表記で末尾にゼロを含めないようにするにはカスタム数値形式文字列を使用する必要がありそう。"0.######"のような形式を指定すると所望の表記になる。

> 0.00001.ToString("0.######")
"0.00001"
> 12345.0.ToString("0.######")
"12345"

IFormatProvider

ToStringメソッドにはIFormatProviderインタフェースを実装したオブジェクトを指定することができる。これは小数点やマイナス記号にどのような文字を使用するかなどを制御するのに使う。

デフォルトのCultureInfo.CurrentCultureで問題ないことが多いと思うが、国/地域に関連づかないCultureInfo.InvariantCultureを使うべきなケースもあるだろう。

> 1.5.ToString(CultureInfo.InvariantCulture)
"1.5"
> 1.5.ToString(CultureInfo.CreateSpecificCulture("de-DE"))
"1,5"

文字列補間でのフォーマット指定

ToStringメソッドを使わず文字列補間を使って文字列化することもある。この場合も標準の数値書式指定文字列やカスタム数値形式文字列の指定はできる。IFormatProviderの指定は簡単にはできない。

> $"value={1.41421356:0.######}"
"value=1.414214"