.NET: максимально короткое строковое представление двойного значения

Спецификатор общего формата ("G") преобразует число в более компактную запись с фиксированной или научной нотацией. Проблема в том, что все еще могут быть ведущие нули в показателе степени.

Пример:

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

1E-06

Есть ли строка числового формата, которая удалит начальный ноль в показателе степени, так что результат

1E-6

Я все еще хочу, чтобы функция возвращала нотацию с фиксированной точкой, если она более компактна. Другими словами, я хочу кратчайшее строковое представление двойного значения.

редактировать: я хотел бы сделать это без постобработки

2 ответа

Вы можете использовать постобработку для удаления начальных нулей.

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
Другие вопросы по тегам