Python wstawia dwukropek w liczbie dziesiętnej z programu Access przez pyodbc

Mamten sam problem jak ten facet i ewentualnieten facet, ale jestem w pobliżu, aby podzielić się kodem i odpowiedzieć na pytania!

Mam pewien kod w zadaniu wsadowym, który odczytuje pola z bazy danych Microsoft Access za pośrednictwem pyodbc i przygotowuje wyjście do wyświetlenia.

Oto fragment. Zwróć uwagę na twierdzenie.

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

Po uruchomieniu pomyślnie przetwarza 100 000 wierszy, a następnie kończy się niepowodzeniem:

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

Zwróć uwagę na nieprawidłową okrężnicę. Występuje rzadko - około raz na 300 000 rekordów.

Kiedy próbuję go odizolować, oczywiście działa.

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

54871,00 USD

Typ pola w programie Access to:

Typ danych: WalutaMiejsca dziesiętne: 2Maska wprowadzania:Domyślna wartość:Zasada walidacji:Wyrównaj tekst: Ogólne

Moje niejasne podejrzenie wskazujące palcem na podstawie niewystarczających dowodów: pyodbc grzebie w wewnętrznych elementach dziesiętnych, być może zdezorientowanych przez korupcję w dostępie. Tak jak @atatmurzwraca uwagę:

„:” to „9” + 1 w ASCII

Ktoś to widział i rozwiązał?

Wersje:

Python 2.7.4pyodbc 3.0.6 (najnowsze)Access 2010System Windows 7

Kopanie dalej:

Thedecimal moduł jest zaimplementowany w Pythonie. Z mojego czytania wynika, że ​​wartości są opisane czterema atrybutami:_exp, _int, _sign, _is_special

Podejrzewając korupcję, wydrukowałem wartości tych pól.

Zaskakująco, boobie wadliwa i działająca wersja, otrzymuję:

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

To jest dziwne.

wdecimal moduł,__float__ funkcja jest zdefiniowana dość prosto:

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

Ale kiedy robię to ze złymi danymi:

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

Dostaję:

Str. 54871.0000

Float 54870 .:

Im więcej się uczę, tym mniej to dziwnenie dostać.

questionAnswers(1)

yourAnswerToTheQuestion