2011-08-10 13 views
5

大規模な数値を科学的な書式で書式化しようとしていますが、3の倍数で計算する必要があります。これを行うための推奨される方法はありますか?フォーマットC#倍数から3の倍数の倍数のScientfic表記

私はテーブルの中に数字の範囲を持っています。実際の科学的フォーマット(小数点の前に1桁の数字があります)の代わりに、私は3の倍数のべき乗を持つためにその変更をしています。例:

3.123e + 003
19.523e + 003

よりもむしろ:

3.123e + 003
1.952e + 004

すべての力を3の倍数にすると、テーブルをスキャンしやすくなります。

ありがとうございます。

+1

これは一般に「エンジニアリング表記」と呼ばれ、また、この質問で説明されていますhttp://stackoverflow.com/questions/808104/engineering-notation-in-c。 –

+0

ありがとうBピート。そのポストを見ていたのですが、私はエンジニアではないので、ユニットと混同し始めました。同僚は、テーブルのユニットではなく、3の倍数について尋ねました。面白い投稿ですが、私はオプションとして浮かせるかもしれません:) – Marc

+0

ユニット指定(m、k、...)を使用するかどうかにかかわらず、私は、他の質問で議論された方法のいくつかは、あなたがそれを述べたように問題が発生します。 –

答えて

4

あなた自身の機能を書く必要があると思います。 最初に必要な精度より2桁大きい数値で科​​学的表現を得ることができます。 次に、得られた文字列を解析して浮動小数点係数と10のべき指数を10進数の型として取得する必要があります。その後、分割インデックスの残りを3で分析し、適切な方法で数値を変更します。最後に出力文字列を生成します。

static string Scientific3(double value, int precision) 
{ 
    string fstr1 = "{0:E" + (precision+2).ToString() + "}"; 
    string step1 = string.Format(fstr1, value); 
    int index1 = step1.ToLower().IndexOf('e'); 
    if (index1 < 0 || index1 == step1.Length - 1) 
     throw new Exception(); 
    decimal coeff = Convert.ToDecimal(step1.Substring(0, index1)); 
    int index = Convert.ToInt32(step1.Substring(index1 + 1)); 
    while(index%3!=0) 
    { 
     index--; 
     coeff *= 10; 
    } 
    string fstr2 = "{0:F" + precision.ToString() + "}E{1}{2:D3}"; 
    return string.Format(fstr2, coeff, ((index < 0) ? "-" : "+"), Math.Abs(index)); 
} 
+0

ああ、クール!既に解析された文字列を分析し、そこから操作することは考えていませんでした。これをコンバーターに書き込んで、アイデアとコードに感謝します:D – Marc