2013-04-18 37 views
2

我有一個模型,可以在您上傳圖片時自動調整圖片的大小並保存原件。Django無法將float轉換爲Decimal。首先將浮點數轉換爲字符串

的問題是,當我將圖像保存在管理控制檯中,我得到這個錯誤

不能浮動轉換爲十進制。首先浮動轉換爲字符串

File "C:\o\mysite\fruit\models.py" in save 
61.   super(Pic, self).save(*args, **kwargs) 
File "C:\Python26\lib\decimal.py" in __new__ 
    652.        "First convert the float to a string") 

Exception Type: TypeError at /admin/fruit/pic/add/ 
Exception Value: Cannot convert float to Decimal. First convert the float to a string 

我實在不明白爲什麼我得到這個錯誤

我的models.py

class Pic(models.Model): 
    user = models.ForeignKey(User) 
    image = models.ImageField(
     upload_to="image", 
     blank=True 
     ) 
    descrip = models.TextField() 
    ratio = models.DecimalField(decimal_places=5,max_digits=10,default=0) 

    def __unicode__(self): 
     return self.descrip 

    def original(self): 
     width = self.image.width/float(self.ratio) 
     height = self.image.height/float(self.ratio) 

     result = "<img src='/media/{0}' height='{1}' width='{2}'>".format(
      self.image, height, width) 

    return result 

    def save(self, *args, **kwargs):  
     pw = self.image.width 
     ph = self.image.height 
     mw = 200 
     mh = 200 

     self.ratio = getWH(pw, ph, mw, mh, 'r') 

     super(Pic, self).save(*args, **kwargs) 

     if (pw > mw) or (ph > mh): 
      filename = str(self.image.path) 
      imageObj = img.open(filename) 

      ratio = 1 

      if (pw > mw): 
       ratio = mw/float(pw) 
       pw = mw 
       ph = int(math.floor(float(ph)* ratio)) 
      if (ph > mh): 
       ratio = ratio * (mh /float(ph)) 
       ph = mh 
       pw = int(math.floor(float(ph)* ratio)) 

      width = getWH(pw, ph, mw, mh, 'w') 
      height = getWH(pw, ph, mw, mh, 'h') 

      imageObj = imageObj.resize((width, height),img.ANTIALIAS) 
      imageObj.save(filename) 



def getWH(pw, ph, mw, mh, result): 
    ratio = 1 

    if (pw > mw): 
     ratio = mw/float(pw) 
     pw = mw 
     ph = int(math.floor(float(ph)* ratio)) 
    if (ph > mh): 
     ratio = ratio * (mh /float(ph)) 
     ph = mh 
     pw = int(math.floor(float(ph)* ratio)) 

    if result == 'w': 
     return pw 
    elif result == 'h': 
     return ph 
    else: 
     return ratio 

回答

4

由於從官方文檔9.4.8. Decimal FAQ

問:爲什麼模塊中不包含float_to_decimal()例程?

答:關於將二進制 和十進制浮點數進行混合是否可取是一個問題。此外,它的使用需要特別小心,以避免 與二進制浮點相關的代表性問題:

順便說一句,你可以找到在給定鏈路的答案:

def float_to_decimal(f): 
    "Convert a floating point number to a Decimal with no loss of information" 
    n, d = f.as_integer_ratio() 
    numerator, denominator = Decimal(n), Decimal(d) 
    ctx = Context(prec=60) 
    result = ctx.divide(numerator, denominator) 
    while ctx.flags[Inexact]: 
     ctx.flags[Inexact] = False 
     ctx.prec *= 2 
     result = ctx.divide(numerator, denominator) 
    return result 

而且也是這個功能已經包含在python 2.7中。

相關問題