将Unicode字符串转换为Decimal - Python 2.7

时间:2015-01-16 12:53:08

标签: python google-app-engine unicode

我正在使用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:十进制的文字无效:''

3 个答案:

答案 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)"。