1

我有一个从 html 解析的字符串: u'\u2212$9.02', (-$9.02)

简单地做一个 float() 转换是行不通的。“十进制”编解码器无法在位置 0 对字符 u'\u2212' 进行编码:无效的十进制 Unicode 字符串。

也许尝试检测字符串中的“\u2212”?但那该怎么做呢?

知道怎么做吗?

4

3 回答 3

4

你可以做

s = u'\u2212$9.02'
float(s.replace(u'\u2212', '-').replace('$', ''))

请注意,美元符号也会导致问题。

于 2013-10-28T05:18:29.330 回答
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 模块的其他用途取自模块文档

于 2013-10-28T05:34:19.470 回答
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

由于浮点错误,通常最好将货币管理为美分(或更小,如有必要)。

于 2013-10-28T05:28:05.313 回答