介绍
重新实现上一个挑战中的个税计算器,可以计算并处理多人的工资并打印税后工资。
项目需求改变:
- 输出税后工资
- 计算过程需要扣除社会保险费用
- 支持多人同时计算工资
- 打印税后工资列表
个税计算公式:
- 应纳税所得额 = 工资金额 - 各项社会保险费 - 起征点(3500元)
- 应纳税额 = 应纳税所得额 × 税率 - 速算扣除数
其中各项社会保险费我们在本程序中需要计算,计算公式由于各地不一样,我们此处使用国内某一城市的计算比例,占工资金额的比例如下:
- 养老保险:8%
- 医疗保险:2%
- 失业保险:0.5%
- 工伤保险:0%
- 生育保险:0%
- 公积金:6%
注意,此处不考虑社保缴费基数的问题。直接使用工资金额计算社保费用即可。
税率及速算扣除数对应表:
应纳税所得额 | 税率 | 速算扣除数(元) |
---|---|---|
不超过 1500 元 | 3% | 0 |
超过 1500 元至 4500 元 | 10% | 105 |
超过 4500 元至 9000 元 | 20% | 555 |
超过 9000 元至 35000 元 | 25% | 1005 |
超过 35000 元至 55000 元 | 30% | 2755 |
超过 55000 元至 80000 元 | 35% | 5505 |
超过 80000 元 | 45% | 13505 |
例如工资金额为 5000,那么五险一金缴纳 825 元,应纳税所得额为 675(5000-825-3500),应纳税额为 20.25 元(675*3% - 0)。税后工资为 4154.75(5000-825-20.25)。
程序的输入为员工的工号和工资金额,输入的格式为 工号:工资 工号:工资
,程序使用 Python3 运行,执行过程如下:
注意:输出必须严格按照上述格式,在冒号的两边不能有空格
需要注意,程序执行的参数有一个或多个,并且参数为工号及工资金额,工资金额需要为整数,如果参数数量不准确或者无法转成整数,需要打印下面这一行的错误信息:
目标
完成任务需要达成的目标:
- 程序存放的位置
/home/shiyanlou/calculator.py
- 程序可以处理1个及多个员工工资计算,输出的内容为1行或多行,每行内容必须为
工号:税后工资
- 程序返回的税后工资数字保留两位小数,如果是整数,仍然需要保留
xxx.00
这种形式
注意
- try except 判断异常的时候只需要包含可能出现异常的代码,比如将输入的字符串转换成 int 的时候,不需要包含所有的代码
- Python 中对每行的缩进要求严格,务必不要TAB与空格混用,建议使用空格来进行缩进,缩进使用4个空格。
提示语
- 参数列表是
sys.argv[1:]
(这种切片的方式是去掉第一个sys.argv[0]
之后的参数列表),然后使用for
循环取出每个参数for arg in sys.argv[1:]:
,arg 的值类似101:3500
的字符串,然后使用这个字符串的arg.split(':')
分成两部分的列表,前一部分是101
,后面的是3500
,注意这都是字符串,再使用int()
转成数字。 - 将参数转成整数可以使用
int()
,如果不能正确转成整数(例如int('abcd')
),需要处理异常并打印上面的错误信息。 - 输出保留两位小数可以使用字符串的 format 函数格式化
- 命令行参数获取方法是使用
sys
模块的sys.argv
,其中sys.argv[0]
为脚本名称,sys.argv[1]
为第一个参数,示例:
- 多个参数的处理方式可以使用列表或字典来存储、计算、输出员工工资信息
- 计算社保及个税的过程可以写成函数,调用起来更方便
最后,因为后续的挑战将会用到现在写的代码,请使用 下载代码
保存到本地或者提交到自己的 Github。
知识点
- Python3 基础语法
- 列表及字典
- 格式化输出
- 命令行参数
- 函数
#!/usr/bin/env python3 2 import sys 3 num = [] 4 mon = [] 5 i = 0 6 def calculator(): 7 8 for argv in sys.argv[1:]: 9 try: 10 #num.append(int(argv.split(':')[0])) 11 l = argv.split(':') 12 num.append(int(l[0])) 13 #mon.append(int(argv.split(':')[1])) 14 mon.append(int(l[1])) 15 except: 16 print("Parameter Error") 17 18 for i in range(len(mon)): 19 m = mon[i] 20 if m > 3500: 21 salary = m * 0.835 - 3500 22 if salary > 80000: 23 cal_salary = m * 0.835-(salary * 0.45 - 13505) 24 elif salary > 55000: 25 cal_salary = m * 0.835-(salary * 0.35 - 5505) 26 elif salary > 35000: 27 cal_salary = m * 0.835-(salary * 0.3 - 2755) 28 elif salary > 9000: 29 cal_salary = m * 0.835-(salary * 0.25 - 1005) 30 elif salary > 4500: 31 cal_salary = m * 0.835-(salary * 0.2 - 555) 32 elif salary > 1500: 33 cal_salary = m * 0.835-(salary * 0.1 - 105) 34 else: 35 cal_salary = m * 0.835-(salary * 0.03) 36 else: 37 cal_salary = m * 0.835 38 print("{}:{:.2f}".format(num[i],cal_salary)) 39 40 #for i in range(len(num)): 41 # n = num[i] 42 # print("{}:{:0.2f}".format(n,cal_salary)) 43 # break 44 calculator()