如何将字符串转换包含一个指数为十进制,回到串(How to convert a string con

2019-09-20 05:37发布

我将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的则值是正确写入文本文件中的值。

更新:
挖掘到德尔福FloatToStr功能和帮助文件(这是存储在文本文件中的值),我带着如下:

将得到的字符串使用定点格式如果数字到的值的小数点左侧的数量小于或等于指定的精度,并且如果该值大于或等于0.00001(编辑:这应该是0.0001有是Delphi的文档中的错误)。 否则,所得的字符串使用科学格式,和数字参数指定的在指数的最小位数(0和4之间)。
...
如果为正值部分是空的,或如果整个格式字符串是空的,该值被使用一般浮点格式带有15个显著数字格式化的,对应于要FloatToStrF呼叫与ffGeneral格式 。 通用浮点格式也使用如果值有超过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且小于精度说明更大; 否则,使用科学记数法。 结果包含如果需要的话,和小数点后尾随零省略小数点。 如果精度说明存在和显著位在结果中的数超过了指定的精度,多余的尾随数字被四舍五入除去。

然而,如果数是一个小数,并且省略精度说明,定点表示法始​​终使用和尾随零被保留。

如果使用科学记数法,在结果的指数,前缀为“E”,如果格式指示符是“G”,或“E”如果格式指示符为“g”。 该指数包含至少两位数 。 这不同于由指数格式说明,其中包括最小的在指数三位数字产生用于科学记数法的格式。

结果字符串由当前NumberFormatInfo对象的格式信息的影响。 下表列出了控制结果字符串格式化的NumberFormatInfo属性。

人们可以很容易设置精度如mydecimal.toString(“G15”),但是我还没有找到一种方法来设置数字的“E”标志后的数字一样容易在Delphi FloatToStrF功能

Answer 1:

将字符串转换为数字,因为你已经想通了,你只需要使用一个double 。 我想尝试不同的转换,但:

double myNum = double.Parse("<yournumber>", NumberStyles.AllowExponent | NumberStyles.Float, CultureInfo.InvariantCulture);

AllowExponentFloat应该保持的符号,并InvariantCulture取小数分频器(这可能不是取决于区域设置的点)的照顾。

您可以通过输出科学记数法表示string.Format()就像这样:

double num = 1234.5678; // 1.2345678e+03
string.Format("{0:e}", num); // should output "1.2345678E+03"

如果你有和没有“E + XX”的部件编号来区分,你必须转换字符串翻番之前,搜索它,以及全段(警告:未测试)可能看起来像:

string myString = ReadNumberFromFile(); // Just a placeholder method
double myNum = double.Parse(myString, NumberStyles.AllowExponent | NumberStyles.Float, CultureInfo.InvariantCulture);
string output = string.Empty; //this will be the "converted-back number" container
if (myString.IndexOf("e", StringComparison.OrdinalIgnoreCase) >= 0)
{
    //Number contains the exponent
    output = string.Format("{0:e}", num); // exponential notation 'xxxExx' casing of 'e' changes the casing of the 'e' in the string
}
else
{
    //TODO: Number does NOT contain the exponent
    output = string.Format("{0:f}", num); // fixed-point notation in the form 'xxxx.xxx'
}

这里的关键是,尽可能数去, 不带指数是没有任何任何区别,它只是一种表象的事情(和它没有什么意义来区分他们:这真的是相同的 )。



文章来源: How to convert a string containing an exponential number to decimal and back to string