.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