9

私は約0.000001から1,000,000,000.000までの値を持つことができるDoubleを持っています

この数値を文字列としてフォーマットしたいのですが、条件付きでそのサイズによって異なります。したがって、非常に小さい場合は、次のような形式でフォーマットします。

String.Format("{0:.000000000}", number);

それがそれほど小さくない場合、たとえば0.001の場合、次のようなものを使用します

String.Format("{0:.00000}", number);

それが終わったら、1,000と言って、次のようにフォーマットします。

String.Format("{0:.0}", number);

フォーマットする値のサイズに基づいてこのフォーマット文字列を作成する賢い方法はありますか?

4

5 に答える 5

15

doubleの絶対値のMath.Log10を使用して、小数点以下の桁数の左(正の場合)または右(負の場合)に必要な0の数を計算します。この値に基づいてフォーマット文字列を選択します。ゼロ値を個別に処理する必要があります。

string s;
double epislon = 0.0000001; // or however near zero you want to consider as zero
if (Math.Abs(value) < epislon) {
    int digits = Math.Log10( Math.Abs( value ));
    // if (digits >= 0) ++digits; // if you care about the exact number
    if (digits < -5) {
       s = string.Format( "{0:0.000000000}", value );
    }
    else if (digits < 0) {
       s = string.Format( "{0:0.00000})", value );
    }
    else {
       s = string.Format( "{0:#,###,###,##0.000}", value );
    }
}
else {
    s = "0";
}

または、桁数に基づいて動的に構築します。

于 2008-12-10T03:48:03.020 に答える
2

文字列内のオプションの位置には#文字を使用します。

string.Format("{0:#,###,##0.000}", number);

ダブルの精度が混乱する可能性があるため、このような小数点以下の桁数を制御することはできないと思います。

出力する小数点以下の桁数を決定するロジックをカプセル化するには、カスタムフォーマッターの作成を検討できます。

于 2008-12-10T03:42:52.733 に答える
2

OwenPのフォローアップ(および「拡張」tvanfossonによる):

それが十分に一般的であり、C#3.0を使用している場合は、doubleの拡張メソッドに変換します。

class MyExtensions 
{
    public static string ToFormmatedString(this double d)
    {
        // Take d and implement tvanfosson's code
    }
}

今、あなたがダブルを持っているところならどこでもあなたはすることができます:

double d = 1.005343;
string d_formatted = d.ToFormattedString();
于 2009-04-11T18:49:14.653 に答える
2

質問の最初の 2 つの String.Format は、末尾のゼロを自動的に削除することで解決できます。

String.Format("{0:#,##0.########}", number);

最後の問題は、1000 を超える値に対して Math.Round(number,1) を呼び出してから、同じ String.Format を使用することで解決できます。

何かのようなもの:

String.Format("{0:#,##0.########}", number<1000 ? number : Math.Round(number,1));
于 2008-12-10T13:53:35.230 に答える
1

私の場合は、カスタムラッパークラスを作成し、tvanfossonのコードをそのToStringメソッドに配置します。そうすれば、引き続きdouble値を使用できますが、ほぼすべての場合に正しい文字列表現が得られます。次のようになります。

class FormattedDouble
{ 
    public double Value { get; set; }

    protected overrides void ToString()
    {
        // tvanfosson's code to produce the right string
    }
}

構造体にしたほうがいいかもしれませんが、大きな違いはないと思います。次のようなクラスを使用できます。

var myDouble = new FormattedDouble();
myDouble.Value = Math.Pi;
Console.WriteLine(myDouble);
于 2008-12-10T23:36:21.327 に答える