我需要将字符串"1.2345E-02"(以指数表示法表示的数字)解析为十进制数据类型,但Decimal.Parse("1.2345E-02")只是抛出一个错误
我在delphi和c#之间转换代码.
值作为字符串存储在delphi应用程序的文本文件中.存储值的示例是:'4.42615029219009E-5'
现在在我的c#app中,我需要读取该字符串值,然后才能再次写出该值.最初我使用的代码类似于:
string stringField = "4.42615029219009E-5";
double someMoneyVar = Convert.ToDouble(stringField)
Run Code Online (Sandbox Code Playgroud)
稍后如果我需要使用someMoneyVar的值重新创建文本文件,那么使用简单的:
string.Format("{0}", someMoneyVar)
Run Code Online (Sandbox Code Playgroud)
输出:
4.42615029219009E-05 // note the 0
Run Code Online (Sandbox Code Playgroud)
最后,我读到最好将钱存入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,十进制为29
如果用科学记数法表示数字所得的指数大于-5且小于精度说明符,则使用定点表示法; 否则,使用科学记数法.如果需要,结果包含小数点,并且省略小数点后的尾随零.如果存在精度说明符且结果中的有效位数超过指定的精度,则通过舍入删除多余的尾随数字.
但是,如果数字是十进制并且省略精度说明符,则始终使用定点表示法并保留尾随零.
如果使用科学记数法,如果格式说明符为"G",则结果中的指数以"E"为前缀,如果格式说明符为"g",则以"e"为前缀.指数至少包含两位数.这与由指数格式说明符生成的科学计数法格式不同,指数格式说明符包含指数中至少三位数.
结果字符串受当前NumberFormatInfo对象的格式设置信息的影响.下表列出了控制结果字符串格式的NumberFormatInfo属性.
可以轻松设置精度,例如mydecimal.toString("G15")但是我还没有找到一种方法来设置'E'符号后面的位数,就像delphi FloatToStrF函数一样容易