【发布时间】:2011-10-12 00:51:14
【问题描述】:
在所有基础类型都是字符串的数据格式中,数字类型必须转换为可以按字母顺序进行比较的标准化字符串格式。例如,如果没有负数,则值 27 的 short 可以表示为 00027。
将double 表示为字符串的最佳方式是什么?在我的情况下,我可以忽略否定,但我很好奇在任何一种情况下你会如何表示双重。
更新
根据 Jon Skeet 的建议,我现在正在使用它,虽然我不能 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
我已经确认了 Jon 的怀疑 - 使用此方法无法使用底片。下面是一些示例代码:
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
下面接受的答案是正确的。谢谢大家!
【问题讨论】:
-
为什么要对字符串(=表示)而不是实际值进行排序?这几乎总是一个坏主意。
-
@Konrad 我在问题中解释了这一点 - “所有基础类型都是字符串”。具体来说,我使用的是 Lucene,但还有其他格式也需要按字母排序。