介紹
重新實現上一個挑戰中的個稅計算器,可以計算並處理多人的工資並打印稅后工資。
項目需求改變:
- 輸出稅后工資
- 計算過程需要扣除社會保險費用
- 支持多人同時計算工資
- 打印稅后工資列表
個稅計算公式:
- 應納稅所得額 = 工資金額 - 各項社會保險費 - 起征點(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()