最近有个神奇的需求,经常在一起聚众点咖啡的咖啡组小伙伴们,突然觉得经常要手算群收款金额有点麻烦,希望有个工具可以快速计算金额。

很好,这就变成一个计算题了,我们来分析一下计算规则。

现在瑞幸咖啡的市价:22 元,25 元,28 元(共三种价位)

某宝瑞幸咖啡代充券价:10.4 元,11.4 元,12.4 元(对应上述三种价位)【这里可以发现淘宝价大概人均 4.8 折左右。】

瑞幸本身又经常会送诸如:1.8 折,3.8 折这样的优惠券

所以现在如果有五个人要点咖啡,比如 1 杯 22 的咖啡,3 杯 25 的咖啡,1 杯 28 的咖啡,你又刚好有一张瑞幸送的 1.8 折的优惠券,怎么让优惠最大化呢?

很明显,解决方案是:买 4 张淘宝代充券即可,让 28 那杯咖啡用个 1.8 折的券,可以获得最大优惠。

现在问题来了,用 1.8 折优惠的咖啡比原来淘宝可以多省 3 折的钱,而这个 3 折的钱还需要再平摊给每个人来共享优惠,请输出分摊优惠以后每个人应该付的钱。

写成脚本方便运行,而且还类似计算器的感觉,我当然首选 wxPython 来实现。

项目代码:瑞幸咖啡优惠共享计算器 (欢迎来 star ~)

前面代码基本上都是用来画 wxPython 的界面的,重点来看下计算规则实现。

try:
    coffee_22 = int(self.m_textCtrl2.GetValue())
    flag1 = 1
except:
    coffee_22 = int('0')
    flag1 = 0
try:
    coffee_25 = int(self.m_textCtrl3.GetValue())
    flag2 = 1
except:
    coffee_25 = int('0')
    flag2 = 0
try:
    coffee_28 = int(self.m_textCtrl4.GetValue())
    flag3 = 1
except:
    coffee_28 = int('0')
    flag3 = 0

people = coffee_22 + coffee_25 + coffee_28

这里先拿到咖啡数量,控件里面拿到的都是 str,要注意转成 int。

接下来计算券与券之间的优惠差价:

try:
    quan = float(self.m_textCtrl5.GetValue()) * 0.1
except:
    quan = int('1')
try:
    quan_coffee = int(self.m_textCtrl6.GetValue())
except:
    quan_coffee = int('0')

if quan_coffee == 22:
    reduction = 10.4 - 22 * quan
elif quan_coffee == 25:
    reduction = 11.4 - 25 * quan
elif quan_coffee == 28:
    reduction = 12.4 - 28 * quan
else:
    reduction = 0

average = reduction / people

这里就纯粹是美化一下最后的输出了,没点的咖啡就不用输出金额了。

if flag1 == 0 and flag2 == 0 and flag3 ==1:
    self.m_staticText1.SetLabel("\n瑞幸 28 元咖啡应支付 " + str(12.4 - average) + " 元")
if flag1 == 0 and flag2 == 1 and flag3 ==0:
    self.m_staticText1.SetLabel("\n瑞幸 25 元咖啡应支付 " + str(11.4 - average) + " 元")
if flag1 == 0 and flag2 == 1 and flag3 ==1:
    self.m_staticText1.SetLabel( "\n瑞幸 25 元咖啡应支付 " + str(11.4 - average) + " 元\n瑞幸 28 元咖啡应支付 " + str(12.4 - average) + " 元")
if flag1 == 1 and flag2 == 0 and flag3 ==0:
    self.m_staticText1.SetLabel("\n瑞幸 22 元咖啡应支付 " + str(10.4 - average) + " 元")
if flag1 == 1 and flag2 == 0 and flag3 ==1:
    self.m_staticText1.SetLabel("\n瑞幸 22 元咖啡应支付 " + str(10.4 - average) + " 元\n瑞幸 28 元咖啡应支付 " + str(12.4 - average) + " 元")
if flag1 == 1 and flag2 == 1 and flag3 ==0:
    self.m_staticText1.SetLabel("\n瑞幸 22 元咖啡应支付 " + str(10.4 - average) + " 元\n瑞幸 25 元咖啡应支付 " + str(11.4 - average) + " 元")
if flag1 == 1 and flag2 == 1 and flag3 ==1:
    self.m_staticText1.SetLabel("\n瑞幸 22 元咖啡应支付 " + str(10.4 - average) + " 元\n瑞幸 25 元咖啡应支付 " + str(11.4 - average) + " 元\n瑞幸 28 元咖啡应支付 " + str(12.4 - average) + " 元")

最后的效果:


↙↙↙阅读原文可查看相关链接,并与作者交流