我正在 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 的值没有指数部分,则该值将正确写入文本文件。
Update:
深入delphi的浮点转字符串函数和帮助文件(将值存储在文本文件中)我附带了以下内容:
如果数字位数,则结果字符串使用定点格式
数值小数点左边小于或等于
达到指定的精度,并且如果该值大于或等于
至 0.00001(编辑:这应该是0.0001。delphi文档中有错误)。否则结果字符串使用科学格式,
Digits 参数指定中的最小位数
指数(0 到 4 之间)。
...
如果正值部分为空,或者整个格式
字符串为空,该值使用通用浮点格式
格式化为 15 位有效数字,对应于调用
FloatToStrF 与ff通用格式。通用浮点数
如果值超过 18 位,也会使用格式化
小数点左边且格式字符串未指定
科学计数法。
因此请记住浮点转字符串函数调用浮动到StrF使用 15 个有效(精度)数字和 0 作为最小位数,因此我们最终得到
4.42615029219009E-5
如果数字是 2 那么数字将显示为
4.42615029219009E-05
根据 MSDNhttp://msdn.microsoft.com/en-us/library/dwhawy9k.aspx#GFormatString
使用通用格式说明符,双精度数为15,十进制为29
如果指数由以下结果产生,则使用定点表示法
用科学记数法表示大于-5的数字并且
小于精度说明符;否则,科学计数法是
用过的。如果需要,结果包含小数点,并且尾随
小数点后的零被省略。如果精度说明符
存在且结果中有效位数超过
指定的精度,多余的尾随数字被删除
四舍五入。
但是,如果数字是 Decimal 并且精度说明符是
省略,始终使用定点表示法,并且尾随零
保存下来。
如果使用科学记数法,则结果中的指数带有前缀
如果格式说明符为“G”,则为“E”,如果格式说明符为“e”
说明符是“g”。指数至少包含两位数。这
与生成的科学计数法格式不同
指数格式说明符,至少包括三个
指数中的数字。
结果字符串受格式信息的影响
当前 NumberFormatInfo 对象。下表列出了
NumberFormatInfo 控制结果格式的属性
细绳。
人们可以轻松设置精度,例如mydecimal.toString("G15") 但是我仍然没有找到一种方法可以像在delphi中一样轻松地设置“E”符号后的位数浮动到StrF功能