1. 程式人生 > >java程式之出差補助計算

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