2010-08-01 77 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},...]),然后格式化每个项目的“金额”值?如果是这样,我该怎么做?

有没有更好的解决方案来实现我的目标?任何帮助,将不胜感激。

TIA, 艾伦

回答

7

没错:

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

感谢亚历克斯 - 这是一个不错的解决方案。问候。 – 2010-08-01 16:22:12

1

另一种方法是你的价值存储为美分的整数(这始终是一个确切的金额,不四舍五入),然后使用divmod报表显示时转换为美元:

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

感谢保罗 - 有趣的解决方案,但它意味着重新设计所有带有货币字段的表格,以及所有提取和处理货币值的代码。但是,从长远来看,这可能是值得的。问候。 – 2010-08-01 16:25:52