Delphi と C# の間でコードを変換しています。
値は、デルファイ アプリからテキスト ファイルに文字列として格納されます。格納された値の例: '4.42615029219009E-5'
今私の c# アプリでは、その文字列値を読み込み、後で値を再度書き出す機能を持たせる必要があります。最初に、次のようなコードを使用しました。
string stringField = "4.42615029219009E-5";
double someMoneyVar = Convert.ToDouble(stringField)
後で someMoneyVar の値を使用してテキスト ファイルを再作成する必要がある場合は、次の単純なものを使用します。
string.Format("{0}", someMoneyVar)
出力します:
4.42615029219009E-05 // note the 0
最後に、C# ではお金を 10 進数として格納する方がよいと読みました。を使用して文字列値を 10 進数に変換しようとしましたdecimal.Parse(someMoneyVar, NumberStyles.Any)
が、書式設定が失われます。
入力されたとおりにデータを出力する必要があります。
someMoneyVar の値には、常に指数部が含まれているとは限らないことに注意してください。例: 0.0428860331919443。someMoneyVar の値に指数部がない場合、値はテキスト ファイルに正しく書き込まれます。
更新:
Delphi のFloatToStr関数とヘルプ ファイル (テキスト ファイルに値を格納するもの) を掘り下げると、次のものが付属していました。
値の小数点の左側の桁数が指定された精度以下の場合、および値が 0.00001 以上の場合、結果の文字列は固定小数点形式を使用します(編集: これは 0.0001 である必要があります)。 . Delphi のドキュメントに誤りがあります) . それ以外の場合、結果の文字列は科学的形式を使用し、Digits パラメーターは指数の最小桁数 (0 ~ 4) を指定します。
...
正の値のセクションが空の場合、またはフォーマット文字列全体が空の場合、ffGeneral フォーマットでの FloatToStrF の呼び出しに対応する、有効桁数 15 桁の一般的な浮動小数点フォーマットを使用して値がフォーマットされます。. 値の小数点以下の桁数が 18 桁を超えていて、書式文字列で指数表記が指定されていない場合は、一般的な浮動小数点書式も使用されます。
したがって、 FloatToStr関数が FloatToStrF の呼び出しを行うことを念頭に置いて、15 桁の有効 (精度) 桁と最小桁数として 0 を使用する ため、最終的には次のようになります。
4.42615029219009E-5
数字が 2 の場合、数字は次のように表示されます。
4.42615029219009E-05
一般的な書式指定子を使用した MSDN http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx#GFormatStringによると、
double の精度は 15 で、decimal は 29 です。
数値を科学表記法で表現した結果の指数が -5 より大きく、精度指定子より小さい場合は、固定小数点表記法が使用されます。それ以外の場合は、指数表記が使用されます。結果には、必要に応じて小数点が含まれ、小数点の後の末尾のゼロは省略されます。精度指定子が存在し、結果の有効桁数が指定された精度を超える場合、余分な末尾の桁は丸めによって削除されます。
ただし、数値が Decimal で精度指定子が省略されている場合、固定小数点表記が常に使用され、末尾のゼロは保持されます。
科学表記法が使用されている場合、結果の指数には、形式指定子が "G" の場合は "E" が、形式指定子が "g" の場合は "e" がプレフィックスとして付けられます。指数には最低 2 桁が含まれます。これは、指数に最低 3 桁を含む指数形式指定子によって生成される科学的表記法の形式とは異なります。
結果の文字列は、現在の NumberFormatInfo オブジェクトのフォーマット情報によって影響を受けます。次の表に、結果の文字列の書式設定を制御する NumberFormatInfo プロパティを示します。
mydecimal.toString("G15") のように精度を簡単に設定できますが、デルファイのFloatToStrF関数のように「E」記号の後の桁数を簡単に設定する方法はまだ見つかりません。