C# 格式化单个&;SimpleDB的双值字符串?

C# 格式化单个&;SimpleDB的双值字符串?,c#,amazon-simpledb,C#,Amazon Simpledb,Amazon的SimpleDB将值存储为字符串,我需要存储数值,以便它们仍能正确比较,例如: “0001”[100,17.0] 0.1-->[099,11.0] -2-->(100,08.0) 依此类推。一个选项(如果您不要求它们是人类可读的)将是首先存储指数(零填充),然后存储尾数。类似于“(07:4.5)的内容通常会写入4.5e7 *smile*您要处理的是有符号值还是小于1的正浮点值?如果是这样的话,你也需要做一些类似的事情,但是在括号中(例如,[]代表正,()代表负)以及尾数 如果你想

Amazon的SimpleDB将值存储为字符串,我需要存储数值,以便它们仍能正确比较,例如:

“0001”<“0002”

我认为字节、整数和小数将相当简单,但我有点不确定处理单精度和双精度的最佳方法,因为它们可以非常小或非常大,并且希望比我聪明的人提供任何建议

(我使用的是C#)

一个选项(如果您不要求它们是人类可读的)是先存储指数(零填充),然后存储尾数。类似于“(07:4.5)的内容通常被写成4.5e7

*
smile
*
您要处理的是有符号值还是小于1的正浮点数?如果是这样,您还需要做类似的操作,但要在括号中(例如,[]表示正,()表示负)以及尾数

如果你想将整数与单数等一起排序,你可能只需要在输入的过程中将所有的整数规格化为最大的类型(例如,你的双数),而不是试图变得太复杂

因此:

  • 7-->[100,17.0]
  • 0.1-->[099,11.0]
  • -2-->(100,08.0)
依此类推。

一个选项(如果您不要求它们是人类可读的)将是首先存储指数(零填充),然后存储尾数。类似于“(07:4.5)的内容通常会写入4.5e7

*
smile
*
您要处理的是有符号值还是小于1的正浮点值?如果是这样的话,你也需要做一些类似的事情,但是在括号中(例如,[]代表正,()代表负)以及尾数

如果你想将整数与单数等一起排序,你可能只需要在输入的过程中将所有的整数规格化为最大的类型(例如,你的双数),而不是试图变得太复杂

因此:

  • 7-->[100,17.0]
  • 0.1-->[099,11.0]
  • -2-->(100,08.0)

依此类推。

如果你已经有了一种表示符号大小数字的方法(比如你说的不太难的
整数),那么你已经有了;-]

IEEE浮点和双精度格式 设计为使数字 “按字典顺序排列”,其中- 用IEEE架构师威廉的话来说 Kahan的意思是“如果两个浮点 相同格式的数字按顺序排列 (假设x它们被排序 同样的方式,当他们的位被 重新解释为符号大小 整数。“

静态公共字符串DoubleToSortableString(双dbl)
{
Int64解释长度=
BitConverter.ToInt64(BitConverter.GetBytes(dbl),0);
返回LongToSortableString(解释为long);
}
静态公共双DoubleFromSortableString(字符串str)
{
Int64解释长度=
LongFromSortableString(str);
返回BitConverter.ToDouble(BitConverter.GetBytes(interpretataslong),0);
}
静态公共字符串LongToSortableString(长lng)
{
如果(液化天然气<0)
返回“-”+(~lng).ToString(“X16”);
其他的
返回“0”+lng.ToString(“X16”);
}
静态公共LongFromSortableString(字符串str)
{
if(str.StartsWith(“-”)
return~long.Parse(str.Substring(1,16),NumberStyles.HexNumber);
其他的
返回long.Parse(str.Substring(1,16),NumberStyles.HexNumber);
}
-0010000000000000=>-1.79769313486232E+308 -3F0795FFFFFFFF=>-100000 -3F3C77FFFFFFFF=>-10000 -3F70BFFFFFFFFFFF=>-1000 -3FA6FFFFFFFFFF=>-100 -3FDBFFFFFFFFFFFF=>-10 -400FFFFFFFFFFFFF=>-1 00000000000000000 => 0 03FF0000000000000=>1 04024000000000000 => 10 04059000000000000 => 100 0408F400000000=>1000 040C388000000000=>10000 040F86A0000000000=>100000 07FEFFFFFFFFFFF=>1.79769313486232E+308
如果您已经有了表示符号大小数字的方法(如您所说的不太难的
整数),那么您已经有了;-]

IEEE浮点和双精度格式 设计为使数字 “按字典顺序排列”,其中- 用IEEE架构师威廉的话来说 Kahan的意思是“如果两个浮点 相同格式的数字按顺序排列 (假设x它们被排序 同样的方式,当他们的位被 重新解释为符号大小 整数。“

静态公共字符串DoubleToSortableString(双dbl)
{
Int64解释长度=
BitConverter.ToInt64(BitConverter.GetBytes(dbl),0);
返回LongToSortableString(解释为long);
}
静态公共双DoubleFromSortableString(字符串str)
{
Int64解释长度=
LongFromSortableString(str);
返回BitConverter.ToDouble(BitConverter.GetBytes(interpretataslong),0);
}
静态公共字符串LongToSortableString(长lng)
{
如果(液化天然气<0)
返回“-”+(~lng).ToString(“X16”);
其他的
返回“0”+lng.ToString(“X16”);
}
静态公共LongFromSortableString(字符串str)
{
if(str.StartsWith(“-”)
return~long.Parse(str.Substring(1,16),NumberStyles.HexNumber);
其他的
返回long.Parse(str.Substring(1,16),NumberStyles.HexNumber);
}
-0010000000000000=>-1.79769313486232E+308 -3F0795FFFFFFFF=>-100000 -3F3C77FFFFFFFF=>-10000 -3F70BFFFFFFFFFFF=>-1000 -3FA6FFFFFFFFFF=>-100 -3FDBFFFFFFFFFFFF=>-10 -400FFFFFFFFFFFFF=>-1 00000000000000000 => 0 03FF0000000000000=>1 04024000000000000 => 10 04059000000000000 => 100 0408F400000000=>1000 040C388000000000=>10000 040F86A0000000000=>100000 07FEFFFFFFFFFFF=>1.79769313486232E+308
而且,单打将无法与双打相媲美,也无法通过此方案与ints相媲美。哎呀!这是一项要求(混合类型)?我想他可以把所有东西都当作替身(就像你建议的那样)
static public string DoubleToSortableString(double dbl)
{
    Int64 interpretAsLong =
        BitConverter.ToInt64(BitConverter.GetBytes(dbl), 0);
    return LongToSortableString(interpretAsLong);
}

static public double DoubleFromSortableString(string str)
{
    Int64 interpretAsLong =
        LongFromSortableString(str);
    return BitConverter.ToDouble(BitConverter.GetBytes(interpretAsLong), 0);
}

static public string LongToSortableString(long lng)
{
    if (lng < 0)
        return "-" + (~lng).ToString("X16");
    else
        return "0" + lng.ToString("X16");
}

static public long LongFromSortableString(string str)
{
    if (str.StartsWith("-"))
        return ~long.Parse(str.Substring(1, 16), NumberStyles.HexNumber); 
    else
        return long.Parse(str.Substring(1, 16), NumberStyles.HexNumber);
}
-0010000000000000 => -1.79769313486232E+308 -3F0795FFFFFFFFFF => -100000 -3F3C77FFFFFFFFFF => -10000 -3F70BFFFFFFFFFFF => -1000 -3FA6FFFFFFFFFFFF => -100 -3FDBFFFFFFFFFFFF => -10 -400FFFFFFFFFFFFF => -1 00000000000000000 => 0 03FF0000000000000 => 1 04024000000000000 => 10 04059000000000000 => 100 0408F400000000000 => 1000 040C3880000000000 => 10000 040F86A0000000000 => 100000 07FEFFFFFFFFFFFFF => 1.79769313486232E+308