我有一个从html解析的字符串:u'\ u2212 $ 9.02',( - $ 9.02)
简单地执行float()转换不起作用。 'decimal'编解码器不能对位置0中的字符u'\ u2212'进行编码:无效的十进制Unicode字符串。
也许尝试在字符串中检测'\ u2212'?但那怎么办呢?
知道怎么做吗?
答案 0 :(得分:4)
你可以做到
s = u'\u2212$9.02'
float(s.replace(u'\u2212', '-').replace('$', ''))
请注意,美元符号也会导致问题。
答案 1 :(得分:2)
对于货币,我更喜欢使用Decimal
模块;而不是处理浮动:
>>> from decimal import Decimal
>>> i = Decimal(s.replace(u'\u2212','-').replace('$',''))
>>> i
Decimal('-9.02')
你可能想知道为什么?您可以阅读计算机中浮点数的近似值,但实际上,这里是Decimal更有意义的示例:
>>> 1.1 + 2.2
3.3000000000000003
>>> Decimal('1.1') + Decimal('2.2')
Decimal('3.3')
>>> 1.30 + 1.20
2.5
>>> Decimal('1.30') + Decimal('1.20')
Decimal('2.50')
以上示例和Decimal模块的其他用法取自module documentation。
答案 2 :(得分:0)
您可以使用正则表达式:
import re
def currency_to_cents(s):
m = re.match(r"([−+]?)\$(\d+)(?:\.(\d+))?", s)
if m is None:
raise ValueError("{!r} is not correctly-formatted currency".format(s))
sign, dollars, cents = m.groups()
amount = int(dollars) * 100
if cents:
amount += int(cents)
if sign == "−":
amount = -amount
return amount
由于浮点错误,通常最好将货币管理为美分(如果需要,可以更小)。