Decimal
This commit is contained in:
+27
-2
@@ -57,5 +57,30 @@ class f32: pass
|
||||
@pwp_number("<d", float)
|
||||
class f64: pass
|
||||
|
||||
@pwp_number("<BiI", Decimal)
|
||||
class decimal: pass
|
||||
class decimal:
|
||||
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