在所有基礎類型都是字符串的數據格式中,必須將數字類型轉換爲可以按字母順序進行比較的標準化字符串格式。例如,如果不存在負數,則值27
的short
可表示爲00027
。將System.Double表示爲可排序字符串的最佳方式是什麼?
將double
表示爲字符串的最佳方式是什麼?在我的情況下,我可以忽略負面情況,但我會好奇你在這兩種情況下如何表現雙倍。
UPDATE
基於喬恩斯基特的建議,我現在用的這個,雖然我不是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
下面的接受的答案是正確的。多謝你們!
爲什麼要排序字符串(=表示法)而不是實際值?這幾乎總是一個壞主意。 –
@Konrad我在問題中解釋了這一點 - 「所有基礎類型都是字符串」。特別是在我的情況下,我使用的是Lucene,但也有其他需要按字母順序排序的格式。 –