我有一个从 html 解析的字符串: u'\u2212$9.02', (-$9.02)
简单地做一个 float() 转换是行不通的。“十进制”编解码器无法在位置 0 对字符 u'\u2212' 进行编码:无效的十进制 Unicode 字符串。
也许尝试检测字符串中的“\u2212”?但那该怎么做呢?
知道怎么做吗?
你可以做
s = u'\u2212$9.02'
float(s.replace(u'\u2212', '-').replace('$', ''))
请注意,美元符号也会导致问题。
对于货币,我更喜欢使用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 模块的其他用途取自模块文档。
您可以使用正则表达式:
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
由于浮点错误,通常最好将货币管理为美分(或更小,如有必要)。