我在 delphi 和 c# 之间转换代码。
值作为字符串存储在 delphi 应用程序的文本文件中。存储值的示例是:'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# 中将钱存储为小数。我尝试使用 将字符串值转换为小数decimal.Parse(someMoneyVar, NumberStyles.Any)
,但是格式丢失了。
我需要完全按照输入的方式输出数据。
请注意, someMoneyVar 的值可能并不总是包含指数部分。例如 0.0428860331919443。如果 someMoneyVar 的值没有指数部分,则该值将正确写入文本文件。
更新:
深入研究 delphi 的FloatToStr函数和帮助文件(将值存储在文本文件中),我得到了以下内容:
如果值中小数点左侧的位数小于或等于指定精度,并且值大于或等于 0.00001 (编辑:这应该是 0.0001 .delphi 文档有错误) . 否则,生成的字符串将使用科学格式,并且 Digits 参数指定指数中的最小位数(介于 0 和 4 之间)。
...
如果正值部分为空,或者整个格式字符串为空,则使用具有 15 个有效数字的通用浮点格式格式化该值,对应于使用ffGeneral 格式调用 FloatToStrF. 如果值的小数点左侧超过 18 位并且格式字符串未指定科学记数法,则也使用通用浮点格式。
因此请记住,FloatToStr函数调用FloatToStrF使用 15 个有效(精度)数字和 0 作为最小位数,因此我们最终得到
4.42615029219009E-5
如果数字为 2,则数字将显示为
4.42615029219009E-05
根据 MSDN http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx#GFormatString
使用通用格式说明符,双精度为 15,十进制为 29
如果以科学记数法表示数字所产生的指数大于 -5 且小于精度说明符,则使用定点记数法;否则,使用科学计数法。如果需要,结果包含一个小数点,小数点后的尾随零被省略。如果存在精度说明符并且结果中的有效位数超过指定的精度,则通过舍入去除多余的尾随数字。
但是,如果数字是 Decimal 并且省略了精度说明符,则始终使用定点表示法并保留尾随零。
如果使用科学记数法,则如果格式说明符为“G”,则结果中的指数前缀为“E”,如果格式说明符为“g”,则为“e”。指数至少包含两位数。这与由指数格式说明符生成的科学记数法格式不同,指数格式说明符在指数中至少包含三位数字。
结果字符串受当前 NumberFormatInfo 对象的格式信息影响。下表列出了控制结果字符串格式的 NumberFormatInfo 属性。
可以很容易地设置精度,例如 mydecimal.toString("G15") 但是我仍然没有找到一种方法来设置'E'符号后的位数,就像在 delphi FloatToStrF函数中一样容易