我正在使用webapp2编写GAE项目。
我需要将unicode字符串转换为Decimal值。
我从客户端收到 lat ,如下所示:
lat = self.request.get('lat')
在调试器中,我可以看到收到了lat
,就像那样:u'50.41688620000001'
但是任何尝试转换它都会失败。
我是这样转换的:
edit = Decimal(lat)
错误如下: InvalidOperation:十进制的文字无效:''
但是:
我明确写的时候
lat = u'50.41688620000001'
而不是
lat = self.request.get('lat')
使用Decimal和float,转换工作正常。 可能是什么问题?
修改 我写的时候
lat = self.request.get('lat')
print lat
这会在控制台中打印出来
两行:一行(有建议但不确定原因),第二行实际为50.41688620000001
。
因此,当处理Decimal(lat)
时,它首先获取空值。
EDIT2:
我坐了一段时间后意识到了实际问题。
我调用了这个服务器函数,它转换来自两个jquery ajax函数的值。一个人确实将 lat 发送到服务器而另一个没有,但做了一些其他的工作。当函数被调用两次时,self.request.get('lat')
也被赋值两次:一个为空,另一个为预期值 - 一个Unicode值。因此,在转换并碰撞为空值时,出现空字符串的错误: InvalidOperation:十进制的文字无效:''
答案 0 :(得分:3)
您的错误消息非常明确:
Invalid literal for Decimal: ''
# ^^
它告诉您空字符串(''
)不是Decimal()
对象的有效文字。您的lat
值不是导致此问题的原因; 值的工作正常:
>>> from decimal import Decimal
>>> lat = u'50.41688620000001'
>>> Decimal(lat)
Decimal('50.41688620000001')
在webapp2
框架self.request.get('lat')
中,如果URL GET参数中的lat
参数不存在,则会返回空字符串。见Request Data:
默认情况下,如果请求的参数不在请求中,
get()
将返回空字符串(''
)。
您可能希望防范,或者检索合理的默认值:
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)
答案 1 :(得分:0)
lat = u'50.41688620000001'
print(float(lat.encode("ascii","ignore")))
OR
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)))
OR
lat = u'50.41688620000001'
print(float(str(lat)))
答案 2 :(得分:0)
为什么不使用它?
edit = Decimal(lat or 0)
如果" lat"是假的(一个空字符串,无)它返回"或"后面的部分,在这种情况下为0.所以如果" lat"是一个空字符串," lat或0"转换为0.因此,表达式转换为"十进制(0)"。