【发布时间】:2012-07-24 17:19:09
【问题描述】:
我正在 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
使用通用格式说明符,double 的精度为 15,decimal 为 29
如果指数由 用科学计数法表示的数字大于 -5 并且 小于精度说明符;否则,科学记数法是 用过的。如果需要,结果包含一个小数点,并且尾随 小数点后的零被省略。如果精度说明符 存在且结果中的有效位数超过 指定的精度,多余的尾随数字被删除 四舍五入。
但是,如果数字是 Decimal 并且精度说明符是 省略,始终使用定点符号,尾随零 保存。
如果使用科学计数法,则结果中的指数带有前缀 如果格式说明符为“G”,则为“E”,如果格式说明符为“e” 说明符是“g”。 指数至少包含两位数。这 不同于由 指数格式说明符,其中至少包括三个 指数中的数字。
结果字符串受格式信息的影响 当前的 NumberFormatInfo 对象。下表列出了 控制结果格式的 NumberFormatInfo 属性 字符串。
可以轻松设置精度,例如mydecimal.toString("G15") 但是我仍然没有找到一种方法来设置'E'符号后的位数,就像在 delphi FloatToStrF 函数中那样容易
【问题讨论】:
-
"
double someMoneyVar" - 不要。用小数表示钱。