2013-10-28 2 views
1

을 떠 변환 : u는, '\ $ 9.02 u2212'-)파이썬은 유니 코드 빼기 기호 내가 HTML에서 구문 분석 문자열을

는 간단히 말해 플로트 (할 작동하지 않습니다 변환 ($ 9.02). 'decimal'코덱은 0 '위치의 문자'u2212 '를 인코딩 할 수 없습니다. 잘못된 10 진수 유니 코드 문자열입니다.

문자열에서 '\ u2212'을 (를) 감지하려고 시도했을 수 있습니다. 그렇다면 어떻게해야할까요?

어떻게하면 좋을까요?

답변

4

당신은 달러 기호도 문제를 일으키는 것을

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

참고 할 수있다.

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 

이 때문에 부동 소수점 오류의 센트 통화를 관리하는 것이 좋습니다.

2

통화의 경우 Decimal 모듈을 사용하는 것이 더 좋습니다. 수레를 다루는 대신

>>> from decimal import Decimal 
>>> i = Decimal(s.replace(u'\u2212','-').replace('$','')) 
>>> i 
Decimal('-9.02') 

왜 그런지 궁금하실 것입니다. 당신은 컴퓨터에서 수레의 근사치에 읽을 수 있지만, 실제적인 측면에서, 여기 진수가 더 의미 예입니다 : 10 진수 모듈에 대한

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

위의 예와 다른 용도가 module documentation에서 찍은.