2010-08-01 3 views
4

Использование SQLite и Python 3.1, я хочу отображать данные валюты в таблице HTML через. шаблон, который принимает курсор в качестве параметра. Следовательно, все значения валюты должны иметь 2 десятичных знака, но SQLite сохраняет их как тип с плавающей точкой (даже если структура содержит десятичные числа :-(), поэтому некоторые из них должны быть преобразованы перед отображением (например, я хочу, чтобы 12.1 отображалось как 12.10).Замена значения во всех строках курсора

код идет что-то вроде этого (упрощенный для иллюстрации) ...

import sqlite3 
con = sqlite3.connect("mydb") 
con.row_factory = sqlite3.Row 

cur = con.cursor() 
cur.execute("select order_no, amount from orders where cust_id=123") 

for row in cur: 
    row['amount'] = format(row['amount'],'%.2f') 

последняя команда бросает ошибку «# builtins.TypeError: объект„sqlite3.Row“не поддерживает назначение пункта»

Как могу ли я решить проблему, при которой значения объекта строки не могут быть изменены? Могу ли я преобразовать курсор в список словарей (один для eac h строка, например. [{'order_no': 1, 'amount': 12.1}, {'order_no': 2, 'amount': 6.32}, ...]), затем отформатируйте значение «сумма» для каждого элемента? Если да, то как я могу это сделать?

Есть ли лучшие решения для достижения моей цели? Любая помощь будет оценена по достоинству.

ТИА, Алан

ответ

7

Yep:

cur.execute("select order_no, amount from orders where cust_id=123") 
dictrows = [dict(row) for row in cur] 
for r in dictrows: 
    r['amount'] = format(r['amount'],'%.2f') 

Есть и другие способы, но это, кажется, самый простой и прямой один.

+0

Спасибо Alex - это хорошее опрятное решение. С уважением. –

1

Альтернативы хранить значение как целое число центов (которое всегда точная сумма, не округление), а затем конвертировать в доллары при отображении отчетов с помощью divmod:

>>> value_in_cents = 133 
>>> print "$%d.%d" % divmod(value_in_cents,100) 
$1.33 
+0

Thanks Paul - интересное решение, но это будет означать перепроектирование всех таблиц с валютными полями и весь код, который извлекает и обрабатывает валютные значения. Однако это может стоить в конечном итоге. С уважением. –