Skip to content

Instantly share code, notes, and snippets.

@toaco
Last active February 5, 2018 03:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save toaco/e5e368c6622137e635af19d95b4469bb to your computer and use it in GitHub Desktop.
Save toaco/e5e368c6622137e635af19d95b4469bb to your computer and use it in GitHub Desktop.
年阶梯气价计算方式
# encoding=utf8
from decimal import Decimal
def create_ladders(price_name, last_reading, current_reading, price):
""" 目前不考虑优惠,但是可以合计金额里面体现出来
ladder['price_name'] = price_name
ladder['last_reading'] = last_reading
ladder['current_reading'] = current_reading
ladder['gas'] = current_reading - last_reading
ladder['price'] = price
ladder['amount'] = Decimal(current_reading - last_reading) * price
"""
ladders = []
# 得到起数,止数和单价列表
if price.count('|'):
code_array = filter(lambda x: x, price.split('|'))
price_array = zip(code_array[::2], code_array[1::2])
price_array = [list(i) for i in price_array]
for item in price_array:
item[1] = int(item[1])
assert len(price_array) > 0
ok = False
for i, (price, gas) in enumerate(price_array):
if current_reading > gas > last_reading:
if i == 0 or price_array[i - 1][1] < last_reading:
ladders.append([price_name, last_reading, gas, gas - last_reading, price,
Decimal(gas - last_reading) * Decimal(price)])
else:
ladders.append(
[price_name, price_array[i - 1][1], gas, gas - price_array[i - 1][1],
price,
Decimal(gas - price_array[i - 1][1]) * Decimal(price)])
elif current_reading <= gas:
if i == 0:
ladders.append(
[price_name, last_reading, current_reading,
current_reading - last_reading, price,
Decimal(current_reading - last_reading) * Decimal(price)])
else:
# 未测试
if price_array[i - 1][1] > last_reading:
ladders.append(
[price_name, price_array[i - 1][1], current_reading,
current_reading - price_array[i - 1][1], price,
Decimal(current_reading - price_array[i - 1][1]) * Decimal(price)])
else:
ladders.append(
[price_name, last_reading, current_reading,
current_reading - last_reading, price,
Decimal(current_reading - last_reading) * Decimal(price)])
ok = True
break
# ok 处理
if not ok:
if price_array[-1][1] > last_reading:
ladders.append(
[price_name, price_array[- 1][1], current_reading,
current_reading - price_array[- 1][1], code_array[-1],
Decimal(current_reading - price_array[- 1][1]) * Decimal(code_array[-1])])
else:
ladders.append(
[price_name, last_reading, current_reading,
current_reading - last_reading, code_array[-1],
Decimal(current_reading - last_reading) * Decimal(code_array[-1])])
else:
ladders.append(
[price_name, last_reading, current_reading, current_reading - last_reading, price,
Decimal(current_reading - last_reading) * Decimal(price)])
return ladders
if __name__ == '__main__':
assert create_ladders('a', 100, 200, '2.5') == [['a', 100, 200, 100, '2.5', 250]]
# 2个阶梯
assert create_ladders('a', 29, 59, '2.5|60|3.5') == [['a', 29, 59, 30, '2.5', 75]]
assert create_ladders('a', 30, 60, '2.5|60|3.5') == [['a', 30, 60, 30, '2.5', 75]]
# ok
assert create_ladders('a', 60, 70, '2.5|60|3.5') == [['a', 60, 70, 10, '3.5', 35]]
# ok
assert create_ladders('a', 61, 71, '2.5|60|3.5') == [['a', 61, 71, 10, '3.5', 35]]
# ok
assert create_ladders('a', 59, 61, '2.5|60|3.5') == [
['a', 59, 60, 1, '2.5', Decimal('2.5')],
['a', 60, 61, 1, '3.5', Decimal('3.5')],
]
assert create_ladders('a', 58, 62, '2.5|60|3.5') == [
['a', 58, 60, 2, '2.5', 5],
['a', 60, 62, 2, '3.5', 7],
]
## 3个阶梯,原样复制上面的代码,然后追加阶梯,之后仍然有一组测试不通过
assert create_ladders('a', 29, 59, '2.5|60|3.5|80|4.5') == [['a', 29, 59, 30, '2.5', 75]]
assert create_ladders('a', 30, 60, '2.5|60|3.5|80|4.5') == [['a', 30, 60, 30, '2.5', 75]]
# 调整后改组失败,ok
assert create_ladders('a', 60, 70, '2.5|60|3.5|80|4.5') == [['a', 60, 70, 10, '3.5', 35]]
# ok,这是一组临界值
assert create_ladders('a', 61, 71, '2.5|60|3.5|80|4.5') == [['a', 61, 71, 10, '3.5', 35]]
assert create_ladders('a', 59, 61, '2.5|60|3.5|80|4.5') == [
['a', 59, 60, 1, '2.5', Decimal('2.5')],
['a', 60, 61, 1, '3.5', Decimal('3.5')],
]
assert create_ladders('a', 58, 62, '2.5|60|3.5|80|4.5') == [
['a', 58, 60, 2, '2.5', 5],
['a', 60, 62, 2, '3.5', 7],
]
# 类似的补充,未发现问题
assert create_ladders('a', 80, 90, '2.5|60|3.5|80|4.5') == [['a', 80, 90, 10, '4.5', 45]]
assert create_ladders('a', 81, 91, '2.5|60|3.5|80|4.5') == [['a', 81, 91, 10, '4.5', 45]]
assert create_ladders('a', 79, 81, '2.5|60|3.5|80|4.5') == [
['a', 79, 80, 1, '3.5', Decimal('3.5')],
['a', 80, 81, 1, '4.5', Decimal('4.5')],
]
assert create_ladders('a', 78, 82, '2.5|60|3.5|80|4.5') == [
['a', 78, 80, 2, '3.5', Decimal('7')],
['a', 80, 82, 2, '4.5', Decimal('9')],
]
# 跨两个阶梯,未发现问题
assert create_ladders('a', 59, 81, '2.5|60|3.5|80|4.5') == [
['a', 59, 60, 1, '2.5', Decimal('2.5')],
['a', 60, 80, 20, '3.5', Decimal('70')],
['a', 80, 81, 1, '4.5', Decimal('4.5')],
]
assert create_ladders('a', 58, 82, '2.5|60|3.5|80|4.5') == [
['a', 58, 60, 2, '2.5', Decimal('5')],
['a', 60, 80, 20, '3.5', Decimal('70')],
['a', 80, 82, 2, '4.5', Decimal('9')],
]
# assert create_ladders('a', 1625, 1675, '1.90|390|2.28|630|2.85') == [
# ['a', 1625, 1675, 2, '2.5', Decimal('5')],
# ]
# ooo
assert create_ladders('a', 0, 8, '1.90|390|2.28|630|2.85') == [
['a', 0, 8, 8, '1.90', Decimal('1.90') * Decimal('8')],
]
print create_ladders('a', 1231, 1271, '1.90|390|2.28|630|2.85')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment