双精度值的最短字符串表示形式

本文关键字:表示 字符串 双精度 | 更新日期: 2023-09-27 18:15:53

通用("G")格式说明符将数字转换为更紧凑的定点或科学记数法。问题是指数中仍然可以有前导零。

的例子:

Double d = 0.000001;
Console.WriteLine(d.ToString("G"));
1E-06

是否存在一个数字格式字符串,它将删除指数中的前导零,因此结果是

1E-6

我仍然希望函数返回定点符号,如果它更紧凑的话。换句话说,我想要双精度值的最短字符串表示。

编辑:我想这样做没有后处理

双精度值的最短字符串表示形式

您可以使用后处理来删除前导零。

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

这可以通过使用长格式来完成,并手动选择位数

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

我所做的确切版本将把0.0000012351573这样的数字四舍五入到1.235E-6

如果你真的想要最短的,你可以使用

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

这将四舍五入,但总是只有一个数字-例如

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