⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 taxtable.java

📁 Java编写个人所得税计算器, 可以自定义所得税表进行运算, 程序包含完整的Document和测试运行环境
💻 JAVA
字号:
package calculator;

import java.io.*;
import java.util.*;
import exception.BoundsException;

/**
 * 这个类表示TaxTable,整个数据存储的核心,可以对税率表进行各种操作
 * @author ZiHi
 * TaxTable是存储税率表的类,其中由TaxRow通过ArrayList构成
 * @param boolean original 表示表有没有被修改过
 * @param int base 表示税率的起征点
 * @param ArrayList talbe 是ArrayList类型,用于存储税率表
 * @param int rank 用于表示一共有多少级税率
 */
public class TaxTable {
	boolean original;
	int base;
	public ArrayList<TaxRow> table;
	public int rank;
	File f;
	/**
	 * TaxTable的构造函数,主要进行数据的读入,ArrayList的初始化和各参数的初始化
	 * 其中加入了文件读取失败的保护机制
	 */
	public TaxTable(){	
		original=true;
		try{
				f = new File("TaxTable.txt");
				BufferedReader inputStream = new BufferedReader (new InputStreamReader(new FileInputStream(f)));
				table= new ArrayList<TaxRow>();
				String line = inputStream.readLine();
				base=Integer.parseInt(line);
				line = inputStream.readLine();
				rank=Integer.parseInt(line);
				
		    	int i;
		    	
				for(i=0;i<rank;i++){					
					StringTokenizer st =new StringTokenizer(inputStream.readLine());
					int tlevel=Integer.parseInt(st.nextToken());
					double trate=Double.parseDouble(st.nextToken());
					TaxRow temp=new TaxRow(tlevel,trate);
					table.add(i, temp);
				}
				rank=table.size();
	        }
		catch(FileNotFoundException e){}
		catch(IOException e){}
	}
	/**
	 * TaxTable的构造函数,通过另一个对象来初始化
	 * @param TaxTable temp 接收的对象参数
	 */
	public TaxTable(TaxTable temp){
		
		base=temp.base;
		table=temp.table;
		rank=temp.rank;
		
	}
	/**
	 * Save函数主要用于保存表格的变化,这里会检测表格有没有被用户更改,当用户退出
	 * 的时候询问是否保存表格,如果是的话新表格将存入文件,如果没有改变的话会提示
	 * 用户此表不需要保存,此处应注意即使用户进行了操作没有改变表格,仍然需要保存
	 * 最后会有操作成功与否的提示
	 */
	public void Save()
	{  
		
			if(original==false){
			PrintWriter outputStream = null;
			try{
				outputStream = 
					new PrintWriter (new FileOutputStream(f));
			}catch(FileNotFoundException e){}
			outputStream.println(base);
			outputStream.println(rank);
			int i;
	   		for(i=0;i<rank;i++){					
	   			outputStream.println(table.get(i).level+" "+table.get(i).rate);
			}
	   		outputStream.close();
	   		System.out.println("The taxtable h saved!");
		}
		else {System.out.println("The taxtable need'nt to be saved!");}
	}
	/**
	 * SetRank 函数用于设置某一级别的税率基点和税率
	 * @param trank 是用户输入的想要更改的级别
	 * @param tlevel 是用于输入的想要更改的基点
	 * @param trate 是用于输入的想要更改的税率
	 * @exception BoundsException 用于指出用户输如的信息应该在允许的范围内
	 * @exception BoundsException 还可以指出输入的级别不存在
	 */
	public void SetRank(int trank,int tlevel,double trate){
		
		try{	
			TaxRow tt1=(TaxRow)table.get(trank-2);
			TaxRow tt2=(TaxRow)table.get(trank);
			if(trank>0&&trank<=rank){
				if(tlevel>tt1.level&&tlevel<tt2.level){
					if(trate>tt1.rate&&trate<tt2.rate)
						table.set(trank-1,new TaxRow(tlevel,trate));
					else throw new BoundsException(tt1.rate,tt2.rate);
				}
				else throw new BoundsException(tt1.level,tt2.level);
			}
			else throw new BoundsException("rank");
		}
		catch (BoundsException e){}
		original=false;
		return;
	}
	/**
	 * AddRank 函数用于增加某一级别的税率基点和税率,这里程序会自动定位所需插入的级别
	 * @param tlevel 是用于输入的想要更改的基点
	 * @param trate 是用于输入的想要更改的税率
	 * @exception BoundsException 用于指出用户输如的信息应该在允许的范围内
	 * @exception BoundsException 还可以指出输入的某个级别基点已经存在
	 */
	public void AddRank(int tlevel,double trate){
		try{
		if(tlevel==0) throw new BoundsException("level");
		int i=1;
		TaxRow tt=(TaxRow)table.get(rank-i);
		if(tlevel>tt.level){
			table.add(new TaxRow(tlevel,trate));
			rank++;
			original=false;
			return ;
		}	
		if(tlevel==tt.level){}
		while(tlevel<tt.level){
			i++;
			tt=(TaxRow)table.get(rank-i-1);	
		}
			TaxRow tt1=(TaxRow)table.get(rank-i);
			if(tlevel>tt.level&&tlevel<tt1.level){
				TaxRow t1=(TaxRow)table.get(rank-i);
				if(trate<t1.rate&&trate>tt.rate){
				table.add(rank-i, new TaxRow(tlevel,trate));
				rank++;
				}
				else throw  new BoundsException(tt.rate,t1.rate);
			}
			else throw new BoundsException("level");
		}
		catch (BoundsException e){}
		original=false;
		return;
	}
	/**
	 * DeletRank 函数用于删除某一级别的税率基点和税率
	 * @param tr 是用户想要删除的级别
	 * @exception BoundsException 可以指出用户输入的级别不存在
	 */
	public void DeletRank(int tr){
		try{
			if(tr>0&&tr<=rank)		
			{
				table.remove(tr-1);
				rank--;
			}
			else throw new BoundsException(1,rank);
		}
		catch (BoundsException e){}
		original=false;
	}
	public String toString(){
		return ("The total rank is "+rank+"\n"
				+"The tax base is "+base+"\n"
				);
	}
	/**
	 * Show 函数用于列出税率表的全部内容,其中通过使用toString函数
	 */
	public void Show()
	{
		System.out.println(".........The tax table...........");
		int i;
		System.out.print(toString());
		for(i=1;i<=rank;i++)
		{
			System.out.println("Rank "+i+": >"+table.get(i-1).toString()+"%");
		}
		System.out.println(".................................");
	}
	public static void main(String args[]) throws IOException
	{
		TaxTable testTable=new TaxTable();
		System.out.println("Now runinng the taxtable test program!");
		testTable.Show();
		System.out.println("Now test save!");
		testTable.Save();
		System.out.println("Now test add! add level=600 rate=9");
		testTable.AddRank(600,9);testTable.Show();
		System.out.println("Now test add! add level=600 rate=15");
		testTable.AddRank(600,15);testTable.Show();
		System.out.println("Now test add! add level=600 rate=10");
		testTable.AddRank(600,10);testTable.Show();
		System.out.println("Now test add! add level=600 rate=16");
		testTable.AddRank(600,16);testTable.Show();
		System.out.println("Now test add! add level=600 rate=11");
		testTable.AddRank(600,11);testTable.Show();
		System.out.println("Now test delete! delete rank=6");
		testTable.DeletRank(6);testTable.Show();
		System.out.println("Now test delete! delete rank=6");
		testTable.DeletRank(6);testTable.Show();
		System.out.println("Now test add! add level=20000 rate=25");
		testTable.AddRank(20000,25);testTable.Show();
		System.out.println("Now test set! set rank=3 level=500 rate=11");
		testTable.SetRank(3, 500, 11);testTable.Show();
		System.out.println("Now test set! set rank=3 level=2000 rate=11");
		testTable.SetRank(3, 2000, 11);testTable.Show();
		System.out.println("Now test set! set rank=3 level=499 rate=11");
		testTable.SetRank(3, 499, 11);testTable.Show();
		System.out.println("Now test set! set rank=3 level=2001 rate=11");
		testTable.SetRank(3, 2001, 11);testTable.Show();
		System.out.println("Now test set! set rank=3 level=700 rate=9");
		testTable.SetRank(3, 700, 9);testTable.Show();
		System.out.println("Now test set! set rank=3 level=700 rate=15");
		testTable.SetRank(3, 700, 15);testTable.Show();
		System.out.println("Now test set! set rank=3 level=700 rate=10");
		testTable.SetRank(3, 700, 10);testTable.Show();
		System.out.println("Now test set! set rank=3 level=700 rate=16");
		testTable.SetRank(3, 700, 16);testTable.Show();
		System.out.println("Now test set! set rank=3 level=700 rate=12");
		testTable.SetRank(3, 700, 12);testTable.Show();
		System.out.println("delete rank=3");
		testTable.DeletRank(3);testTable.Show();
		System.out.println("Now test save!");
		testTable.Save();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -