替换所有游标行中的值

5 投票
2 回答
3790 浏览
提问于 2025-04-16 02:08

我在用SQLite和Python 3.1,想通过一个模板把货币数据展示在HTML表格里,这个模板需要一个游标作为参数。所以所有的货币值都得保留两位小数,但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' object does not support item assignment”,意思是说行对象的值不能被改变。

我该怎么解决这个问题呢?我能不能把游标转换成一个字典列表(每一行一个字典,比如 [{'order_no':1, 'amount':12.1}, {'order_no':2, 'amount':6.32}, ...]),然后格式化每个项目的'amount'值?如果可以的话,我该怎么做呢?

有没有更好的方法来实现我的目标?任何帮助都非常感谢。

谢谢,
Alan

2 个回答

1

另一种方法是把你的金额存储为整数形式的美分(这样总是能精确表示,没有四舍五入的问题),然后在生成报告时用 divmod 函数转换成美元来显示:

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

没错:

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')

还有其他方法,但这个方法看起来是最简单、最直接的。

撰写回答