2015-01-16 2 views
-2

저는 webapp2로 GAE 프로젝트를 작성하고 있습니다.
유니 코드 문자열을 10 진수 값으로 변환해야합니다.유니 코드 문자열을 10 진수로 변환 - 파이썬 2.7

나는이 같은 클라이언트 측에서 위도가 나타납니다 실패 변환 u'50.41688620000001' 그러나 어떤 시도를 : 디버거에서

lat = self.request.get('lat') 

내가 lat받은 그처럼되는 것을 볼 수 있습니다. 나는 그런 식으로 변환 해요 :

edit = Decimal(lat) 

오류는 다음과 같다 InvalidOperation은 : 잘못된 문자를 10 진수 : 내가 대신 명시 적으로

lat = u'50.41688620000001' 

을 쓸 때
:

하지만를 ''

lat = self.request.get('lat') 

변환은 Decimal과 float 모두에서 잘 작동합니다. 무엇이 문제 일 수 있습니까?

편집 : 나는 콘솔에 두 줄

lat = self.request.get('lat') 
print lat 

이 인쇄를 쓸 때 : 빈 하나를 (그러나 확실히 아직 정확히 왜하지 제안이) 두 번째는 실제로 50.41688620000001입니다.

따라서 Decimal(lat)이 처리 될 때 먼저 빈 값이 사용됩니다.


는 EDIT2 :
나는 앉아 잠시 후 실제 문제를 깨달았다. 2 개의 jquery ajax 함수에서 값을 변환하는이 서버 함수를 호출했습니다. 하나는 을 서버에 보내고 다른 하나는 다른 작업을 수행하지 않았습니다. 함수가 두 번 호출 될 때 self.request.get('lat')에는 값이 두 번 할당되었습니다. 하나는 비어 있고 다른 하나는 예상대로 - 유니 코드 값입니다. 변환 및 빈 값 부딪히는 그래서 동안, 하늘의 캐릭터 라인의 오류가 arised : InvalidOperation : 잘못된 문자를 10 진수 :

+1

왜 'float (lat)'가되지 않습니까? –

+0

float도 시도했지만 오류가 발생합니다. * ValueError : 문자열을 부동으로 변환 할 수 없습니다. * – Elena

+0

오류가 발생하는 경우 이것이 아닙니다. 변환하려는 문자열. 실제 문자열을 게시하십시오. –

답변

2

을 '' 오류 메시지는 매우 명확합니다.

Invalid literal for Decimal: '' 
#       ^^ 

빈 문자열 ('')이 Decimal() 개체에 유효한 리터럴이 아님을 알려줍니다.lat 값은이 문제의 원인이 아닙니다. 값은 잘 작동 것을 :

>>> from decimal import Decimal 
>>> lat = u'50.41688620000001' 
>>> Decimal(lat) 
Decimal('50.41688620000001') 

webapp2 프레임 워크 self.request.get('lat')에서 빈 문자열을 반환합니다 lat 매개 변수는 URL GET 매개 변수에없는 경우. Request Data 참조 :

lat = self.request.get('lat', '0.0') # provide a default 

또는

lat = self.request.get('lat') 
if not lat: 
    # return an error message, as lat is missing or empty 

또는

lat = self.request.get('lat') 
if lat: 
    # lat is provided, parse it to a Decimal 
    lat = Decimal(lat) 
+0

저는 webapp2를 사용하고 있습니다. 맨 위에 쓰여졌습니다. – Elena

+0

@ 엘레나 : 아, 그래, 그렇게 했어. –

+0

나는 * self.request.get ('lat') *의 반환 값이 정확히 어떻게 생겼는지 알아 내려고한다. 문서에서는 불행히도 반환 된 값의 유형에 대한 세부 정보를 찾지 못했습니다. 나는 사전이나 다른 것을 의미한다. – Elena

0
lat = u'50.41688620000001' 

print(float(lat.encode("ascii","ignore"))) 

또는

def unicodeTofloat(unicode): 
    unicode=str(unicode) 
    ret=0.0 
    integer=unicode[:unicode.find('.')] 
    decimal=unicode[unicode.find('.')+1:] 
    ii=1 
    for i in integer: 
     ret += int((10**(len(integer)-ii))*int(i)) 
     ii+=1 
    ii=-1 
    for i in decimal: 
     i=int(i); 
     ret += (i*(10**ii)) 
     ii-=1 
    return ret; 

lat = u'50.41688620000001' 
print(str(unicodeTofloat(lat))) 

또는

lat = u'50.41688620000001' 
print(float(str(lat))) 
+1

으로 바뀌고 ** 인코딩도 **되지 않고 작동합니다. OP가 우리에게 진짜 * 문제가되는 가치를주지는 못했습니다. –

+1

오류 메시지는 OP가 * 빈 문자열 *로 전달되었음을 보여줍니다. –

+0

@ Fire360Boy, 고맙습니다. 답변을 주셔서 감사합니다. 오류의 실제 이유를 발견하고 EDIT2에서 설명했습니다. – Elena

0

왜 :

By default, get() returns the empty string ('') if the requested argument is not in the request.

당신은 아마 대신 재치있는 기본이 방지하거나 검색 할 이걸 써? "위도는"falsy 경우

edit = Decimal(lat or 0) 

은 (빈 문자열은 없음)는이 경우 0 그래서 "위도는"빈 문자열은 "위도는 0"경우가 번역에, 뒤에 "또는"부분을 반환 그리고 그 표현은 "십진수 (0)"로 변환됩니다.

+0

이 게시물을 방문하는 사용자가 코드를 이해할 수 있도록 코드에 대한 설명을 추가하십시오. –

관련 문제