この記事は公開から3年以上経過しています。
.NET開発で計測値のような小数点を含む値を固定幅で印刷したい場合などに、最大桁数範囲内で有効数字の桁数が最大となるように動的に小数点の端数を四捨五入(AwayFromZero)してフォーマットを行う方法。
※例えば最大4桁で小数第2位までを出力する場合0.015 → "0.02"
, 10.15 → "10.2"
, 100.5 → "101"
, -10.15 → "-10"
のような出力になります。
端数を四捨五入ではなく切り捨てたい場合は、「.NETで小数点以下の値を指定した位まで残して切り捨てる方法」もご参照ください。
サンプルソースコード
C#
static class Extensions
{
public static string FormatWithDecimalPoints(this decimal number, int maxNumOfDigits, int numOfDecimalPlaces)
{
var ret = string.Empty;
var n = numOfDecimalPlaces;
while (n >= 0)
{
ret = number.ToString($"F{n}");
if (ret.Length <= maxNumOfDigits) break;
n -= 1;
}
if (n < 0) ret = new string('#', maxNumOfDigits);
return ret;
}
}
VB.NET
Imports System.Runtime.CompilerServices
Module Extensions
<Extension>
Function FormatWithDecimalPoints(number As Decimal, maxNumOfDigits As Integer, numOfDecimalPlaces As Integer) As String
Dim ret = String.Empty
Dim n = numOfDecimalPlaces
Do While n >= 0
ret = number.ToString($"F{n}")
If ret.Length <= maxNumOfDigits Then Exit Do
n -= 1
Loop
If n < 0 Then ret = New String("#"c, maxNumOfDigits)
Return ret
End Function
End Module
使い方
decimal型の値に、本拡張メソッド.FormatWithDecimalPoints(最大桁数, 残す小数の位)
を付加します。
変換結果が第2パラメータで指定する最大桁数を超える場合は、最大桁数分の#
を出力します。
(固定幅にしたい場合は、適宜結果文字列をString.PadLeft()
してください。)
実行結果
幾つかのパターンで実行した結果は以下のとおりです。
検証コード(C#):
var nn = new[]
{
0M,
0.1M,
0.124M,
0.135M,
99.90M,
999.5M,
9999.4M,
9999.5M,
-1.04M,
-1.05M,
-99.0M,
-99.9M,
-999.9M,
};
foreach (var n in nn)
{
// 最大4桁、小数第2位まで
Console.WriteLine($"{n} → \"{n.FormatWithDecimalPoints(4, 2)}\"");
}
Console.ReadKey();
出力結果:
0 → "0.00"
0.1 → "0.10"
0.124 → "0.12"
0.135 → "0.14"
99.90 → "99.9"
999.5 → "1000"
9999.4 → "9999"
9999.5 → "####"
-1.04 → "-1.0"
-1.05 → "-1.1"
-99.0 → "-99"
-99.9 → "-100"
-999.9 → "####"
以上です。