Попробуйте это:
import struct
try: import decimal
except ImportError:
divisor= 10000.0
else:
divisor= decimal.Decimal(10000)
def xl_money(i1, i2):
byte8= struct.unpack(">q", struct.pack(">ii", i1, i2))[0]
return byte8 / divisor
>>> xl_money(1, 1194857614)
Decimal("548982.491")
Деньги в Microsoft COM - это 8-байтовое целое число; это фиксированная точка с 4 десятичными разрядами (т. е. 1 представлен 10000). То, что делает моя функция, это взять кортеж из 4-байтовых целых чисел, создать 8-байтовое целое число, используя struct, чтобы избежать проблем со знаком, а затем разделить на константу 10000. Функция использует decimal.Decimal, если доступно, в противном случае она использует плавать.
ОБНОВЛЕНИЕ (на основе комментария): Пока только значения COM-валюты возвращаются в виде двух целочисленного кортежа, так что вы можете проверить это, но нет никаких гарантий, что это всегда будет успешным. Однако, в зависимости от используемой вами библиотеки и ее версии, вполне возможно, что позже, после некоторого обновления, вы будете получать decimal.Decimal
s, а не двузначные кортежи.