Java、出差报销金额的计算

出差报销金额的计算

某公司员工出差报销有严格的管理制度,不同级别员工计算出差费用的算法不同,并且不同出差地的报销费用标准也不同。

公司给员工报销费用的计算方法如下:

报销金额 = 交通费 + 出差补助 + 住宿费 + 住宿费差额


员工出差报销各项费用详细说明:

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();
		
	}
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值