2016-11-01 142 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 ##)。无论如何拍得漂亮:) –