2016-11-01 188 views
1

一般(「G」)格式說明一個數字轉換爲更緊湊的或者是固定的點或科學記數法中的最短的字符串表示。問題是在指數中仍然可以有前導零。.NET:雙精度值

例子:

Double d = 0.000001; 
Console.WriteLine(d.ToString("G")); 

1E-06 

是否有一個數字格式字符串,將刪除指數前導零所以結果是

1E-6 

我還是希望函數返回定點表示,如果它更緊湊。換句話說,我想要一個double值的最短字符串表示。

編輯:我想做到這一點無需後期處理

+0

真正的問題是你爲什麼要這樣。 – mybirthname

+1

'string result = result.Replace(「E-0」,「E - 」);'會是hacky--但它會起作用。 ;) –

+0

@mybirthname我正在輸出大量由大部分實數組成的數據。通過去除這個前導零,導出文件的大小減少了近10%。 –

回答

0

這可以通過使用格式化的手寫版本,並手動選擇的數字

Double d = 0.000001; 
Console.WriteLine(d.ToString("0.###E-0")); 

1E-6 

確切的版本號來完成我已經將圓了許多像0.0000到1.235E-6

如果你真的想在最短的你可以techincally使用

Console.WriteLine(d.ToString("0E-0")); 

這將圓,但總是有例如

Double d = 0.0000018; 
Console.WriteLine(d.ToString("0.###E-0")); 

2E-6 
1

可以使用後處理以去除前導零隻有一個digit-。

static string Compact(double d) 
{ 
    var s = d.ToString("G"); 
    if(s.Contains("E-0") || s.Contains("E+0")) 
    { 
     s = Regex.Replace(s, @"(\d+)(E[+-])0+(\d+)", "$1$2$3"); 
    } 

    return s; 
} 

使用

Console.WriteLine(Compact(0.000001)); // result: 1E-6 
Console.WriteLine(Compact(12342353465345432313123123123.0)); // result: 1.23423534653454E+28 
Console.WriteLine(Compact(0.000011)); // result: 1.1E-5 
+0

檢查字符串s後面的第三個和第四個字母會更快,因爲指數總是寫在最後(格式E ###或E ##)。無論如何拍得漂亮:) –