Python вставляет двоеточие в десятичное число из Access через pyodbc

у меня естьта же проблема, что и у этого парня и, возможно,этот пареньЯ собираюсь поделиться кодом и ответить на вопросы!

У меня есть некоторый код в пакетном задании, которое читает поля из базы данных Microsoft Access через pyodbc и подготавливает вывод для отображения.

Вот фрагмент. Обратите внимание на утверждение.

def format_currency(amount):
    if amount is None:
        return ""
    else:
        result = "$%.2f" % amount
        assert ":" not in result, (
            "That's weird. The value %r of class %s is represented as %s" %
             (amount, amount.__class__, result))
        return result

Когда я запускаю его, он успешно обрабатывает 100 000 строк, а затем завершается ошибкой:

AssertionError: That's weird. The value Decimal('54871.0000') of class  is represented as $54870.:0

Обратите внимание на аберрантную кишку. Это происходит редко - примерно один раз в 300 000 записей.

Когда я пытаюсь изолировать это, конечно, это работает.

from decimal import Decimal
print "$%.2f" % Decimal('54871.0000')

$ 54871,00

Тип поля в Access:

Тип данных: валютаДесятичные знаки: 2Маска ввода:Значение по умолчанию:Правило проверки:Выравнивание текста: общее

Мое смутное подозрительное подозрение основано на недостаточных доказательствах: pyodbc ковыряется во внутренностях Decimal, возможно, в замешательстве из-за повреждения Access. Как @ecatmurуказывает на то:':'

 это 9 +1 в ASCII

Кто-нибудь видел это и решил?

Версии:

Python 2.7.4pyodbc 3.0.6 (последняя версия)Access 2010Windows 7

Копаем дальше:

decimal Модуль реализован на Python. Из моего чтения значения описываются четырьмя атрибутами:,,,_exp_int_sign_is_special

Заподозрив коррупцию, я распечатал значения этих полей.

Удивительно, но дляи то и другое Неисправную и рабочую версию я получаю:

_exp: -4
_int: 548710000
_sign: 0
_is_special: False

Тот'странно

вdecimal модуль,__float__ Функция определяется довольно просто:

def __float__(self):
    """Float representation."""
    return float(str(self))

Но когда я делаю это с плохими данными:

print "Str", str(amount)
print "Float", float(amount)

Я получил:

Ул 54871,0000

Поплавок 54870 .:

Чем больше я учусь, тем менее страннымне получить.

Ответы на вопрос(1)

Ваш ответ на вопрос