出差报销金额的计算
某公司员工出差报销有严格的管理制度,不同级别员工计算出差费用的算法不同,并且不同出差地的报销费用标准也不同。
公司给员工报销费用的计算方法如下:
报销金额 = 交通费 + 出差补助 + 住宿费 + 住宿费差额
员工出差报销各项费用详细说明:
1、交通费: 这部分实报实销。
2、出差补助:不同地区补贴标准不同。
公司将出差地分成了4类地区:一线城市、二线城市、三线城市、四线城市。
补助标准如下:
=========================================================
地区 一线城市 二线城市 三、四线城市
补贴 90/天 70/天 60/天
=========================================================
3、住宿费:公司规定了不同的住宿等级标准。
将员工分为3种类别:普通员工、主管、高层。标准详见下表:
=========================================================
出差地区
行政级别 一线城市 二线城市 三线城市 四线城市
高层 700/天 600/天 500/天 400/天
主管 350/天 300/天 250/天 150/天
普通员工 270/天 230/天 200/天 150/天
=========================================================
住宿费按照实际宾馆房价报销,宾馆房价与住宿标准不一致的部分,按照下面“住宿费差额”处理。
4、住宿费差额的处理:是指实际住宿费用与住宿标准偏差部分的处理。
(1)、住宿宾馆房价高于住宿标准,超出部分按一定比例自费,将在报销款中直接扣除;
(2)、住宿宾馆房间低于住宿标准,提取一定比例差额,作为住宿补贴发给出差人。
=========================================================
超出标准部分/低于标准部分的差额
行政级别 自费的比例 作为住宿补贴发放的比例
高层 20% 30%
主管 40% 50%
普通员工 50% 70%
=========================================================
【示例】
一公司主管到二线城市出差5天,住宿宾馆房价220/天,交通费用为1038。
则该员工最终的报销费用为:
1038 + 70 * 5 + 220 * 5 + (300-220)*50% * 5 = 2688.00
【题目要求】
1、计算每个人的报销金额,结果四舍五入到“分”,即保留两位小数。
2、为简化输入输出处理,我们仍以数据文件作为程序的输入输出。
(1)、输入文件说明:
a)读取位置为:文件位于主类所在同级目录,名字统一为source.txt
b)每一行记录内容(字段间有一个空格):
【示例】
员工编号 行政级别 出差地类别 交通费 每日宿费单价 出差天数
2011011002F 主管 二线城市 1038 220 5
2001070023M 高层 三线城市 983 550 2
输入文件需要做必要的合法性检查,对于错误的数据,直接跳过不做处理。
(2)、输出文件说明:
a)存放位置:文件位于主类所在同级目录,名字统一为result.txt
b)记录按照人员编号排序
c)每行记录内容(字段间有一个空格):
【示例】
员工编号 报销金额
2001070023M 2183.00
2011011002F 2688.00
package pack2;
import java.io.PrintWriter;
import java.util.Arrays;
public class CSystem extends Staff{
private String id; //员工编号
private double passage; //交通费
private double day; //天数
public CSystem() {
super();
}
public CSystem(String id, String staff, String city,
double passage, double fare, double day) {
super(staff,fare,city); //调用父类构造方法
this.id = id;
this.passage = passage;
this.day = day;
}
//返回报销金额
public double getTotal() {
double total; //报销金额
total = getPassage()+getBonus(getCity())*getDay()+
getFare()*getDay()+(getStaff()-getFare())*getDifference()*getDay();
return total; //报销金额 = 交通费 + 出差补助*天数 + 住宿费*天数 + 住宿费差额*天数
}
//输出记录
public void print(String[] idseq,int i,PrintWriter print) {
int[] sort = new int[i];
for(int j =0;j<i;j++) { //把idseq的前10位数字赋给整型数组sort
sort[j] = Integer.parseInt(idseq[j].substring(0, 10));
}
Arrays.parallelSort(sort); //调用Arrays方法对sort数组排序
for(int j = 0;j<i;j++) {
for(int k = 0;k<i;k++) {
//如果idseq数组的某一个元素匹配上sort[i](0<=i<sort.length)
if(Integer.parseInt(idseq[k].substring(0, 10))==sort[j])
print.printf("%15s%10.2f\n",idseq[k].substring(0, 11),
Double.parseDouble(idseq[k].substring(11)));
}
}
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public double getPassage() {
return passage;
}
public void setPassage(double passage) {
this.passage = passage;
}
public double getDay() {
return day;
}
public void setDay(double day) {
this.day = day;
}
}
package pack2;
public class Staff {
private String[] worker = {"高层","主管","普通员工"}; //行政级别
private String[] are = {"一线城市","二线城市","三线城市","四线城市"}; //城市类别
private final int N = 3,M = 4;
private double[] bonus = {90,70,60}; //出差补助(一线--四线) // 住宿费
private double[][] FaRE = {{700,600,500,400},{350,300,250,150},{270,230,200,150}};
private double[][] difference= {{0.2,0.3},{0.4,0.5},{0.5,0.7}}; //差额
private String staff; //员工
private double fare; //宿费
private String city; //城市
public Staff() {
super();
}
public Staff(String staff, double fare, String city) {
super();
this.staff = staff;
this.fare = fare;
this.city = city;
}
//匹配员工和城市,返回住宿费
public double getStaff() {
for(int i = 0;i<N;i++) {
for(int j = 0;j<M;j++) {
if(staff.equalsIgnoreCase(worker[i])&&city.equalsIgnoreCase(are[j]))
return FaRE[i][j];
}
}
return 0;
}
//匹配城市,返回出差补助
public double getBonus(String area) {
if(area.equalsIgnoreCase(are[0]))
return bonus[0]; //返回一线城市的补助
else if(area.equalsIgnoreCase(are[1]))
return bonus[1]; //返回二线城市的补助
else if(area.equalsIgnoreCase(are[2]))
return bonus[2]; //返回三线城市的补助
else if(area.equalsIgnoreCase(are[3]))
return bonus[2]; //返回四线城市的补助
else return 0;
}
/**返回差额.在0~N(3)次循环内,匹配住宿费差额与行政级别并返回比例*/
public double getDifference() {
for(int i =0;i < N;i++) {
if(getStaff()<getFare()&&staff.equalsIgnoreCase(worker[i]))
return difference[i][0]; //如果超出标准,即标准费用小于实际费用,且匹配到某个员工,返回对应的自费比例
if(getStaff()>getFare()&&staff.equalsIgnoreCase(worker[i]))
return difference[i][1]; //如果低于标准,即标准费用大于实际费用,且匹配到某个员工,返回对应的住宿补贴比例
}
return 0;
}
public double getFare() {
return fare;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
package pack2;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
public class TestCSystem {
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
File file = new File("D:\\java临时文件夹\\source.txt");
PrintWriter output = new PrintWriter(file);
output.printf("%-15s %-10s %-10s %6d %5d %5d\n", "2011011002F","主管","二线城市",1038,220,5);
output.printf("%-15s %-10s %-10s %6d %5d %5d\n", "2001070023M","高层","三线城市",983,550,2);
output.printf("%-15s %-10s %-10s %6d %5d %5d\n", "2010050501S","普通员工","二线城市",1051,300,10);
output.printf("%-15s %-10s %-10s %6d %5d %5d\n", "2000017132S","普通员工","四线城市",810,210,3);
output.printf("%-15s %-10s %-10s %6d %5d %5d\n", "2017180880M","高层","一线城市",2020,720,7);
output.printf("%-15s %-10s %-10s %6d %5d %5d\n", "2010113200F","主管","三线城市",900,330,5);
output.printf("%-15s %-10s %-10s %6d %5d %5d\n", "2018126363F","主管","二线城市",1838,670,1);
output.printf("%-15s %-10s %-10s %6d %5d %5d\n", "2072182261M","高层","一线城市",2261,310,11);
output.printf("%-15s %-10s %-10s %6d %5d %5d\n", "2013183618F","主管","一线城市",1138,520,6);
output.printf("%-15s %-10s %-10s %6d %5d %5d\n", "2011729120S","普通员工","二线城市",1908,320,12);
output.close();
Scanner input = new Scanner(file);
System.out.println("Is file exist? "+input.hasNext());
File file1 = new File("D:\\java临时文件夹\\result.txt");
PrintWriter print = new PrintWriter(file1);
CSystem cs = null;
int i=0;
String[] idseq = new String[100];
while(input.hasNext()) {
String id = input.next();
String staff = input.next();
String city = input.next();
int passage = input.nextInt();
int fare = input.nextInt();
int day = input.nextInt();
cs = new CSystem(id,staff,city,passage,fare,day);
idseq[i++] = cs.getId()+cs.getTotal(); //把编号和报销金额作为字符串赋给idseq
}
cs.print(idseq, i,print);
input.close();
print.close();
}
}