需求
在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版权协议,转载请附上原文出处链接和本声明。