Decimal
This commit is contained in:
+27
-2
@@ -57,5 +57,30 @@ class f32: pass
|
|||||||
@pwp_number("<d", float)
|
@pwp_number("<d", float)
|
||||||
class f64: pass
|
class f64: pass
|
||||||
|
|
||||||
@pwp_number("<BiI", Decimal)
|
class decimal:
|
||||||
class decimal: pass
|
size = struct.calcsize("<qb")
|
||||||
|
|
||||||
|
def __init__(self, value):
|
||||||
|
self.value = Decimal(value)
|
||||||
|
|
||||||
|
def to_com(self):
|
||||||
|
sign, digits, exponent = self.value.as_tuple()
|
||||||
|
|
||||||
|
if not isinstance(exponent, int):
|
||||||
|
raise ValueError("Cannot serialize NaN or Infinity")
|
||||||
|
|
||||||
|
scale = -exponent
|
||||||
|
integer = int("".join(map(str, digits)))
|
||||||
|
|
||||||
|
if sign:
|
||||||
|
integer = -integer
|
||||||
|
|
||||||
|
return struct.pack("<qb", integer, scale)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_com(cls, data, offset=0):
|
||||||
|
integer, scale = struct.unpack_from("<qb", data, offset)
|
||||||
|
|
||||||
|
value = Decimal(integer) / (Decimal(10) ** scale)
|
||||||
|
|
||||||
|
return cls(value), offset + cls.size
|
||||||
Reference in New Issue
Block a user