| 971 | |
| 972 | # Set the decimal value |
| 973 | def set(self, value): |
| 974 | assert ((self._buffer.offset + self.fbe_offset + self.fbe_size) <= self._buffer.size), "Model is broken!" |
| 975 | if (self._buffer.offset + self.fbe_offset + self.fbe_size) > self._buffer.size: |
| 976 | return |
| 977 | |
| 978 | # Extract decimal parts |
| 979 | parts = value.as_tuple() |
| 980 | negative = True if parts.sign == 1 else False |
| 981 | number = int(''.join(map(str, parts.digits))) |
| 982 | scale = -parts.exponent |
| 983 | |
| 984 | # Check for decimal number overflow |
| 985 | bits = number.bit_length() |
| 986 | if (bits < 0) or (bits > 96): |
| 987 | # Value too big for .NET Decimal (bit length is limited to [0, 96]) |
| 988 | self.write_count(self.fbe_offset, 0, self.fbe_size) |
| 989 | return |
| 990 | |
| 991 | # Check for decimal scale overflow |
| 992 | if (scale < 0) or (scale > 28): |
| 993 | # Value scale exceeds .NET Decimal limit of [0, 28] |
| 994 | self.write_count(self.fbe_offset, 0, self.fbe_size) |
| 995 | return |
| 996 | |
| 997 | # Write unscaled value to bytes 0-11 |
| 998 | self.write_bytes(self.fbe_offset, number.to_bytes(12, "little")) |
| 999 | |
| 1000 | # Write scale at byte 14 |
| 1001 | self.write_byte(self.fbe_offset + 14, scale) |
| 1002 | |
| 1003 | # Write signum at byte 15 |
| 1004 | self.write_byte(self.fbe_offset + 15, 0x80 if negative else 0) |
| 1005 | |
| 1006 | |
| 1007 | # Fast Binary Encoding bytes field model |