python 装饰器 对MySQL decimal类型数据转换为float

需求

在sql查询后,需要对结果中 decimal 类型数据进行处理,以解决前端下载的文件 数字不能计算的问题

函数装饰器
from decimal import  * 

# 转 in/float
def convert_digital_num(string):
    string1 = str(string)
    # 负数 
    if string1.count('-') == 1 and string1[0] == '-':
        str2 = string1.split("-")[-1]
        if str2.isdigit():
            # 负整数
            return int(string1)
        elif str2.count('.') == 1:
            left_str = str2.split(".")[0]
            right_str = str2.split(".")[1]
            if left_str.isdigit() and right_str.isdigit():
                # 负小数
                return float(string1)
            else:
                return string
        else:
            return string
    elif string1.isdigit():
        # 正整数
        return int(string1)
    elif string1.count('.') == 1:
        left_str = string1.split(".")[0]
        right_str = string1.split(".")[1]
        if left_str.isdigit() and right_str.isdigit():
            # 正小数
            return float(string1)
        else:
            return string
    else:
        return string
    
# decimal 转float
def convert_digital_decimal(value):
    # 判断decimal类型
    if type(value) is type(Decimal.from_float(0.0)):
        # 转换
        return float(value.quantize(Decimal('0.00000000000')))
    else:
        return value

# 构造装饰器
def convert_digital(func):
    def _number(*args, **kwargs):
        # func:此处适用用函数,类内方法参数加 self
        results =func(*args, **kwargs)
        for data in results:
            for key,value in data.items(): 
                data[key]=convert_digital_num(value)
        return results
    return _number

# 使用装饰器
@convert_digital
def bar(arg1,arg2):
    sql = "SELECT * from table where t1='{}' and t2 = {} limit 50;".format(arg1,arg2)
    cur.execute(sql)
    res = cur.fetchall()
    return res

# 调用函数
bar("arg1","arg2")
类装饰器
from decimal import  * 

class ConvertDigital(object):
    # 装饰器必须重构的两个方法
    def __init__(self, func):
        # 外层
        self._func = func
       
    def __call__(self, *args, **kwargs):
        # 内层
        # self._func(self,*args, **kwargs)
        # self 参数:有,装饰器适用于方法(类内);无,装饰器适用于函数
        self.results =self._func(self,*args, **kwargs)
        for data in self.results:
            for key,value in data.items():
                # 数据处理
                data[key]=self.convert_digital_decimal(value)
        return self.results
    
    # 转换为 int / float 类型
    def convert_digital_num(self,string):
        string1 = str(string)
        # 负数 
        if string1.count('-') == 1 and string1[0] == '-':
            str2 = string1.split("-")[-1]
            if str2.isdigit():
                # 负整数
                return int(string1)
            elif str2.count('.') == 1:
                left_str = str2.split(".")[0]
                right_str = str2.split(".")[1]
                if left_str.isdigit() and right_str.isdigit():
                    # 负小数
                    return float(string1)
                else:
                    return string
            else:
                return string
        elif string1.isdigit():
            # 正整数
            return int(string1)
        elif string1.count('.') == 1:
            left_str = string1.split(".")[0]
            right_str = string1.split(".")[1]
            if left_str.isdigit() and right_str.isdigit():
                # 正小数
                return float(string1)
            else:
                return string
        else:
            return string
            
    # decimal 转换为 float
    def convert_digital_decimal(self,value):
        if type(value) is type(Decimal.from_float(0.0)):
            return float(value.quantize(Decimal('0.00000000000')))
        else:
            return value
            
# 使用装饰器
class Test(object):

    @ConvertDigital
    def bar(self,arg1,arg2):
        sql = "SELECT * from table where t1='{}' and t2 = {} limit 50;".format(arg1,arg2)
        cur.execute(sql)
        res = cur.fetchall()
        return res
        
# 创建实例
a = Test()
a.bar("arg1","arg1")

参考文章

Python装饰器用法实例总结
如何理解Python装饰器?
Python练习题-判断某一个字符串是否是小数
Python float 和 decimal
Python浮点数格式化-Decimal
python中如何判断一个变量的数据类型?(原创)


版权声明:本文为weixin_43514279原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。