В форматах данных, где все базовые типы являются строками, числовые типы должны быть преобразованы в стандартизированный формат строки, который можно сравнивать в алфавитном порядке.Например, short
для значения 27
может быть представлено как 00027
, если нет негативов.
Каков наилучший способ представления double
в виде строки?В моем случае я могу игнорировать негативы, но мне было бы любопытно, как бы вы представляли двойное в любом случае.
ОБНОВЛЕНИЕ
Основываясь на предложении Джона Скита,Я сейчас использую это, хотя я не уверен на 100%, что это будет работать правильно:
static readonly string UlongFormatString = new string('0', ulong.MaxValue.ToString().Length);
public static string ToSortableString(this double n)
{
return BitConverter.ToUInt64(BitConverter.GetBytes(BitConverter.DoubleToInt64Bits(n)), 0).ToString(UlongFormatString);
}
public static double DoubleFromSortableString(this string n)
{
return BitConverter.Int64BitsToDouble(BitConverter.ToInt64(BitConverter.GetBytes(ulong.Parse(n)), 0));
}
ОБНОВЛЕНИЕ 2
Я подтвердил то, что подозревал Джон- негативы не работают с использованием этого метода.Вот пример кода:
void Main()
{
var a = double.MaxValue;
var b = double.MaxValue/2;
var c = 0d;
var d = double.MinValue/2;
var e = double.MinValue;
Console.WriteLine(a.ToSortableString());
Console.WriteLine(b.ToSortableString());
Console.WriteLine(c.ToSortableString());
Console.WriteLine(d.ToSortableString());
Console.WriteLine(e.ToSortableString());
}
static class Test
{
static readonly string UlongFormatString = new string('0', ulong.MaxValue.ToString().Length);
public static string ToSortableString(this double n)
{
return BitConverter.ToUInt64(BitConverter.GetBytes(BitConverter.DoubleToInt64Bits(n)), 0).ToString(UlongFormatString);
}
}
, который выдает следующий вывод:
09218868437227405311
09214364837600034815
00000000000000000000
18437736874454810623
18442240474082181119
Ясно, не отсортировано, как ожидалось.
ОБНОВЛЕНИЕ 3
Принятый ответ ниже является правильным.Спасибо, ребята!