java程序之出差补助计算


某公司为其它公司做技术服务,人员按照客户要求出差外派。补贴是在人员出差前预先派发的。需要计算出每个人的补贴数值,并且需要派出日期先后排序,以便于安排进行统一借款并进行补贴的派发。如果派出日期相同,则按照补贴金额从少到多排序。

按照出差时间长短,补贴的标准是不同的。具体规定是:
30天以内,每日补贴50元;超出31而在60天以内部分,每日补贴多10元,即60元;超出61而在90天以内部分,每日补贴再多0即70元,……以30日为周期以此类推。

出差的天数以自然日计算,不需要考虑节假日。

举例说明:
张三2010-9-16外派出差,到2010-9-30回到公司,计算出差时间为15天,因为少于30天,出差补贴为50*15=750元。
李四2010-9-1外派出差,到2010-10-20回到公司,计算出差时间为50天,50*30+60*20=2700元。

为了方便后期调整出差补贴标准,需要采用config.properties对上面的补贴标准进行配置,程序运行时从C:\test\下读取。
配置文件的内容为:
base=50
step=10

给出的输入文件为C:\test\src.txt,每行内容为3部分,姓名 派出日期 释放日期
其中:每个字段中间以一个空格分隔,日期的形式为2010-9-17。

结果请写入C:\test\result.txt中,每行内容为5部分:姓名 派出日期 释放日期 出差天数 补助金额。
其中:每个字段中间以一个空格分隔,日期的形式为2010-9-17(注:月份或日期位数不满2位的,不需要以0补全2位,即2010-9-1不需要输出为2010-09-01);出差天数、金额保留到整数位。

输入、输出文件编码方式都使用GBK。

提示:编程过程中,可以使用apache commons包中的api (这个建议与考查的内容无关,至少便于对处理文件关闭进行处理,评分是不会有任何影响)
除以上包以外,请使用j2se5.0或6.0的标准内容。引入其他第3方库并不符合考试要求。

src.txt文件的内容:

张三 2010-9-17 2010-10-15
李四 2010-9-5 2010-10-30
王五 2010-9-20 2010-11-2
赵六 2010-10-2 2010-10-30
阿童木 2010-10-15 2010-12-31

result.txt文件的内容:

李四 2010-9-5 2010-10-30 56 3060
张三 2010-9-17 2010-10-15 29 1450
王五 2010-9-20 2010-11-2 44 2340
赵六 2010-10-2 2010-10-30 29 1450
阿童木 2010-10-15 2010-12-31 78 4560

config.properties文件的内容:

base=50
step=10

package com.neusoft.exam; import java.io.File; import java.util.Collections; import java.util.List; /** * * <b>Application name:</b>exam<br> * <b>Application describing:</b>主程序类<br> */ public class ExamMain { /** * * {主函数} * */ public static void main(String[] args) { String srcFilePath = "c:" + File.separator + "test" + File.separator + "src.txt"; String dstFilePath = "c:" + File.separator + "test" + File.separator + "result.txt"; List<PeopleOut> list = FileOperation.readFile(srcFilePath); Collections.sort(list); FileOperation.writeFile(list, dstFilePath); } }


package com.neusoft.exam; import java.io.File; import java.math.BigDecimal; import java.util.Calendar; /** * * <b>Application name:</b>Exam<br> * <b>Application describing:</b> 外派员工信息类<br> */ public class PeopleOut implements Comparable<PeopleOut> { private String name;//姓名 private Calendar startDate;//外派开始日期 private Calendar endDate;//外派结束日期 private int days;//外派的天数 private BigDecimal buTie;//外出的补贴 /** * {无参构造函数} * */ public PeopleOut() { super(); // TODO Auto-generated constructor stub this.days = 0; this.buTie = new BigDecimal("0"); } /** * {带3个参数的构造函数} * * @param name * @param startDate * @param endDate */ public PeopleOut(String name, Calendar startDate, Calendar endDate) { super(); this.name = name; this.startDate = startDate; this.endDate = endDate; this.days = 0; this.buTie = new BigDecimal("0"); this.countBuTie();//调用自己的计算补贴的方法给days和buTie赋值 } /** * * {排序方法} * 需要派出日期先后排序, 如果派出日期相同,则按照补贴金额从少到多排序。 * @param o * @return * @author:developer */ public int compareTo(PeopleOut o) { // if (this.startDate == o.getStartDate()) if (this.getStartDate().compareTo(o.getStartDate()) == 0) { //return o.getBuTie().compareTo(this.getBuTie()); return this.buTie.compareTo(o.getBuTie()); } else { return this.startDate.compareTo(o.getStartDate()); } } /** * * {按照外派的天数计算每个人的补贴} * 按照出差时间长短,补贴的标准是不同的。具体规定是: 30天以内,每日补贴50元;超出31而在60天以内部分,每日补贴多10元,即60元; 超出61而在90天以内部分,每日补贴再多0即70元,……以30日为周期以此类推。 * */ public void countBuTie() { this.days = DateOperation.daysBetween(startDate, endDate); String filePath = "c:" + File.separator + "test" + File.separator + "config.properties"; BigDecimal base = new BigDecimal(PropertyOperation.readProperty(filePath).getProperty("base")); BigDecimal step = new BigDecimal(PropertyOperation.readProperty(filePath).getProperty("step")); int m = days / 30; int n = days % 30; for (int i = 0; i <= m; i++) { if (i == m) { buTie = buTie.add(base.add(new BigDecimal(i).multiply(step)).multiply(new BigDecimal(n))); } else { buTie = buTie.add(base.add(new BigDecimal(i).multiply(step)).multiply(new BigDecimal("30"))); } } this.buTie = buTie.setScale(0, BigDecimal.ROUND_HALF_UP); } /** * buTie的GET方法 * @return BigDecimal buTie. */ public BigDecimal getBuTie() { return buTie; } /** * days的GET方法 * @return int days. */ public int getDays() { return days; } /** * endDate的GET方法 * @return Calendar endDate. */ public Calendar getEndDate() { return endDate; } /** * name的GET方法 * @return String name. */ public String getName() { return name; } /** * startDate的GET方法 * @return Calendar startDate. */ public Calendar getStartDate() { return startDate; } /** * buTie的SET方法 * @param buTie The buTie to set. */ public void setBuTie(BigDecimal buTie) { this.buTie = buTie; } /** * days的SET方法 * @param days The days to set. */ public void setDays(int days) { this.days = days; } /** * endDate的SET方法 * @param endDate The endDate to set. */ public void setEndDate(Calendar endDate) { this.endDate = endDate; } /** * name的SET方法 * @param name The name to set. */ public void setName(String name) { this.name = name; } /** * startDate的SET方法 * @param startDate The startDate to set. */ public void setStartDate(Calendar startDate) { this.startDate = startDate; } /** * * {重写toString()方法,便于输出} * * @return * @author:developer */ public String toString() { StringBuilder sb = new StringBuilder(80); sb.append(name); sb.append(" "); sb.append(DateOperation.dateToStr(startDate)); sb.append(" "); sb.append(DateOperation.dateToStr(endDate)); sb.append(" "); sb.append(days); sb.append(" "); sb.append(buTie); return sb.toString(); } } package com.neusoft.exam; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * * <b>Application name:</b>Exam<br> * <b>Application describing:</b> 文件操作类<br> */ public class FileOperation { /** * * {写入文件操作} * * @param list * @param filePath */ public static void writeFile(List<PeopleOut> list, String filePath) { BufferedWriter bw = null; try { bw = new BufferedWriter(new FileWriter(filePath)); for (PeopleOut p : list) { bw.write(p.toString());//向文件中写入一条数据 bw.newLine();//换行 } bw.flush();//强制输出缓冲区的内容,避免数据缓存,造成文件写入不完整的情况。 } catch (IOException e) { System.out.println("文件写入失败!"); e.printStackTrace(); } finally { if (bw != null) { try { bw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } /** * * {读取文件信息操作} * * @param filePath * @return */ public static List<PeopleOut> readFile(String filePath) { BufferedReader br = null; List<PeopleOut> list = new ArrayList<PeopleOut>(); try { br = new BufferedReader(new FileReader(filePath)); String str = null; String[] params = null; PeopleOut p = null; while ((str = br.readLine()) != null) { params = str.split(" "); p = new PeopleOut(); for (int i = 0; i < params.length; i++) { if (i == 0) { p.setName(params[i]); } if (i == 1) { p.setStartDate(DateOperation.strToDate(params[i])); } if (i == 2) { p.setEndDate(DateOperation.strToDate(params[i])); } } //p = new PeopleOut(params[0], DateOperation.strToDate(params[1]), DateOperation.strToDate(params[2])); p.countBuTie(); list.add(p); } } catch (FileNotFoundException e) { System.out.println("文件未找到!"); e.printStackTrace(); } catch (IOException e) { System.out.println("文件读取失败!"); e.printStackTrace(); } finally { if (br != null) { try { br.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return list; } }


package com.neusoft.exam; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; /** * * <b>Application name:</b>Exam<br> * <b>Application describing:</b>日期操作工具类 <br> */ public class DateOperation { /** * 日期格式转换格式 */ public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d"); /** * 一天的毫秒数 */ public static final long interval = 1000L * 24 * 60 * 60; /** * * {日期转换成字符串函数} * * @param calendar * @return */ public static String dateToStr(Calendar calendar) { String str = null; str = sdf.format(calendar.getTime()); return str; } /** * * {计算两个日期之间相差的天数} * * @param startCal * @param endCal * @return */ public static int daysBetween(Calendar startCal, Calendar endCal) { if (startCal != null && endCal != null) { if (startCal.after(endCal)) { throw new IllegalArgumentException("参数非法,开始时间不能大于结束时间"); } long start = startCal.getTimeInMillis(); long end = endCal.getTimeInMillis(); int res = (int) ((end - start) / interval + 1); return res; } else { return 0; } } /** * * {字符串转换成日期方法 } * * @param str * @return */ public static Calendar strToDate(String str) { Calendar calendar = null; try { calendar = Calendar.getInstance(); calendar.setTime(sdf.parse(str)); } catch (ParseException e) { //throw new RuntimeException(e); System.out.println("格式解析错误!"); e.printStackTrace(); } return calendar; } }


package com.neusoft.exam; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.Properties; /** * * <b>Application name:</b>Exam<br> * <b>Application describing:</b>Properties文件操作工具类 <br> */ public class PropertyOperation { /** * * {读取磁盘上的properties文件信息} * * @param filePath * @return */ public static Properties readProperty(String filePath) { Properties properties = new Properties(); InputStream is = null; try { is = new FileInputStream(filePath); properties.load(is); } catch (FileNotFoundException e) { System.out.println("没有找到文件"); e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (is != null) { try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return properties; } }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值