2013-02-19 23 views
16

私は、.NETがデフォルトでを行う素晴らしい "機能"を見つけました。十分な小数点以下の桁数があれば科学的表記法を使用しています。Double ToString - 科学的表記なし

.005.ToString() // ".005" 
.00005.ToString() // "5E-05" 

標準(非科学的)表記の文字列として表示する効率的な方法を知っている人はいますか?

私はthis questionを見ましたが、どちらもDouble.ToString()を実行して結果を再フォーマットするだけで、上位2つの答えが私にはハックのようです。

ありがとうございました。

EDIT:

所望の出力:

.00005.ToString() == ".00005" 

EDIT2:

すべての重複と近い票とは何ですか?私は特に質問にと言って、同様の質問には満足のいく答えがないと言います。このウェブサイトの人々はあまりにもパワーを幸せにする。

私の解決策:

場合、それは誰にも便利です。

/// <summary> 
/// Converts the double to a standard notation string. 
/// </summary> 
/// <param name="d">The double to convert.</param> 
/// <returns>The double as a standard notation string.</returns> 
public static String ToStandardNotationString(this double d) 
{ 
    //Keeps precision of double up to is maximum 
    return d.ToString(".#####################################################################################################################################################################################################################################################################################################################################"); 

} 

注:私はまだすべての値のためにこれを行うための効率的な方法を発見していない値> 1でしか動作。

+0

あなたは、コンピュータの金属のところで、浮動小数点数は何番目の2進数表記に格納されていることに気付きました。これは皮肉な "特徴"ではない。その振る舞いは型に不可欠です。浮動小数点数を純粋に10進形式で表示することは可能ですが(私はTim Sの答えをサポートしています)、2.68E201のような数値は単純に*ロット*がゼロになります。 – KeithS

+1

@KeithS ToString()は、ハードウェアに関係なく、一貫した動作をする必要があります。それはすべての現代のプログラミングが基づいている抽象化の全体のポイントです。科学記法で何かを得ることが期待される人は、それを明記するだろう。 – MgSam

+0

私はもはや答えることはできませんが、 'double'を' decimal'にキャストしてからToString()を実行することができます。私は、より高速な '10進数'または300文字を超えるフォーマット文字列であるパフォーマンステストを行っていません。 – ygoe

答えて

13

StandardおよびCustom Numeric Format Stringsを参照してください。私はあなたが".################"を探していると思う:

.00005.ToString(".################") // returns ".00005" 

限り、あなたは、小数点の後にその多くの場所よりも多くを持っていないとして、それはそう、ややハックですが、それは動作します。そうであれば、StringBuilderを使用して、文字列に約330 #を組み込むことができます(double.EpsilonはE-324のオーダーです)。

+0

これは唯一の合理的な方法かもしれないと私は恐れていました。実行時に計算するのではなく、324長の "。###"文字列を定数にする方が効率的です。 – MgSam

+1

@MgSamより効率的ですが、確かに...一度計算して保存するだけでは、その効率はごくわずかです。そして、ループを介して文字列を生成することによって得られる明瞭さは価値があるかもしれません...文字列の長さを正確に見ることができ、理由についてのコメントがあります。浮動小数点または何でも、等。これはおそらく少し過度にニッキーピッキーになっています。 – Beska

+2

@Beska 'var format ="を使うことができるときは、ループを使うのは無意味です。 " +新しい文字列( '#'、324) ' – Lukazoid

関連する問題