これは、一見したよりも複雑です。次のことを考慮する必要があります。
- 小数点は文字列の長さに含まれます
- 小数点なしの文字列表現が最大長を超える場合、入力は無効ですが...
- 文字列表現が小数点以下の最大長を超えるだけの場合は、単純に丸めることができます
私の解決策:
public string GetString(CultureInfo culture) {
var integral = (int)Math.Truncate(Value);
var integralLength = integral.ToString().Length;
if (integralLength > MaxLength) {
throw new InvalidOperationException();
}
var integralWithDecimalSeparatorLength = integralLength + culture.NumberFormat.NumberDecimalSeparator.Length;
var minimumFixedPointLength = integralWithDecimalSeparatorLength + 1;
if (minimumFixedPointLength > MaxLength) {
var intValue = (int)Math.Round(Value);
return intValue.ToString("D" + MinLength, culture);
}
var precision = MaxLength - integralWithDecimalSeparatorLength;
return Value.ToString("F" + precision, culture);
}
まず、値の整数部分 (小数を含まない) が長すぎる場合、値が大きすぎます。それ以外の場合、固定小数点 ("F") 文字列の書式設定に使用する精度は、残りの使用可能なスペースに基づいて計算されます。十分なスペースがない場合は、丸められた整数が使用されます。固定小数点形式の最小の長さは、整数、小数点、および 1 桁の 10 進数です (常に少なくとも 1 桁あります。末尾の小数点だけには書式設定されません)。
、MinLength=4
、MaxLength=4
およびValue=954
の出力は です"0954"
がValue=54
、 の場合はの"54.0"
ための十分なスペースがあるため.0
です。これは、実際に存在するかどうかはわかりませんが、小数点記号が複数の文字である文化もサポートします。
いくつかの例:
Value=987.654
、MinLength=4
、MaxLength=4
:"0988"
Value=987.654
、MinLength=3
、MaxLength=4
:"988"
Value=987.654
、MinLength=4
、MaxLength=5
:"987.7"
Value=987.654
、MinLength=4
、MaxLength=10
:"987.654000"