簡體   English   中英

如何將包含指數數字的字符串轉換為十進制並返回到字符串

[英]How to convert a string containing an exponential number to decimal and back to string

我在delphi和c#之間轉換代碼。
值作為字符串存儲在delphi應用程序的文本文件中。 存儲值的示例是:'4.42615029219009E-5'

現在在我的c#app中我需要讀取該字符串值,然后才能再次寫出該值。 最初我使用的代碼類似於:

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,十進制為29

如果用科學記數法表示數字所得的指數大於-5且小於精度說明符,則使用定點表示法; 否則,使用科學記數法。 如果需要,結果包含小數點,並且省略小數點后的尾隨零。 如果存在精度說明符且結果中的有效位數超過指定的精度,則通過舍入刪除多余的尾隨數字。

但是,如果數字是十進制並且省略精度說明符,則始終使用定點表示法並保留尾隨零。

如果使用科學記數法,如果格式說明符為“G”,則結果中的指數以“E”為前綴,如果格式說明符為“g”,則以“e”為前綴。 指數至少包含兩位數 這與由指數格式說明符生成的科學計數法格式不同,指數格式說明符包含指數中至少三位數。

結果字符串受當前NumberFormatInfo對象的格式設置信息的影響。 下表列出了控制結果字符串格式的NumberFormatInfo屬性。

可以輕松設置精度,例如mydecimal.toString(“G15”)但是我還沒有找到一種方法來設置'E'符號后面的位數,就像delphi FloatToStrF函數一樣容易

要將字符串轉換為數字,正如您已經想到的那樣,您只需使用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”部分的數字,您必須在將字符串轉換為double之前搜索它,並且完整的片段(警告:未經測試!)可能如下所示:

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'
}

這里的要點是,就數字而言,無論沒有指數都沒有任何區別,它只是表示的問題(區分它們沒有意義:它實際上是相同的事情 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM