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ólneMoje 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 7Kopanie 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ć.