一个将浮点数转换成人民币读法字符串处理(xxxx.xx格式)

主要是加深对数组的理解在,这个程序原来是《疯狂java讲义》低第103页上的一个例子,但是例子并不完整,对0的处理和对末位包括小数点后面处理不完整,因此这里进行了完善。考虑到人民币通俗叫法,浮点数格式为(XXXX.XX),转换为字符串格式为(x千x百x十x元x角x分),当然还要考虑末位开始位和零的处理。

程序如下:

public class Num2Rmb {
	private String[] hanArr={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
	private String[] unitArr={"分","角","元","十","百","千"};
	/**
	 * 把一个浮点数分解成整数部分和小数部分字符串
	 * @param num 需要被分界飞浮点数
	 * @return 分解出来的整数部分和小数部分,第一部分是整数部分,第二部分是小数部分
	 */
	private String[] divide(double num){
		long zheng=(long)num;    //通过强制转型得到整数部分
		long xiao=Math.round((num-zheng)*100); //浮点数减去整数部分得到小数部分,小数部分乘以100后得到2位小数值
		return new String[]{""+zheng,String.valueOf(xiao)};   //整数转换为字符串(2种方法)
	}
	
	/**
	 * 把一个四位的数字字符串变成汉字字符串
	 * @param numStr 需要被转换的四位数字字符串
	 * @return 四位字符串被转换为汉字字符串
	 */
	private String toHanStr(String[] numStr){
		String result="";
		int numLen0=numStr[0].length();
		int numLen1=numStr[1].length();
		for(int i=0;i<numLen0;i++){
			int num=numStr[0].charAt(i)-48;     //将char变成对应的int数字
			if(num!=0){							//非零情况
				result+=hanArr[num]+unitArr[1+numLen0-i];
			}
			else if(i!=numLen0-1&&i!=0&&num==0){	//中间位数是零
				result+=hanArr[num];
			}
			else if(i==numLen0-1&&num==0) {			//个位是零
				result+=unitArr[1+numLen0-i];
			}
			else if(i==0&&num==0) {					//最高位是零
				result+="";
			}
		}
		for(int j=0;j<numLen1;j++) {          //小数点后位的处理,角和分     
			int num=numStr[1].charAt(j)-48;
			if(num!=0){
				result+=hanArr[num]+unitArr[1-j];
			}
			if(num==0) {
				result+="";
			}
		}
		return result;
	}
	
	public static void main(String[] arg){
		Num2Rmb nr=new Num2Rmb();
		String[] test=nr.divide(323.23);
		//String[] test2= {"0325","25"};
		System.out.println(nr.toHanStr(test));
		
	}
}

今天下午看了一下,感觉上面程序还有些问题,比如在3003这种数据,中间位数有两个0的时候结果不对,改进如下

public class Num2Rmb {
	private String[] hanArr={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
	private String[] unitArr={"分","角","元","十","百","千"};
	/**
	 * 把一个浮点数分解成整数部分和小数部分字符串
	 * @param num 需要被分界飞浮点数
	 * @return 分解出来的整数部分和小数部分,第一部分是整数部分,第二部分是小数部分
	 */
	private String[] divide(double num){
		long zheng=(long)num;    //通过强制转型得到整数部分
		long xiao=Math.round((num-zheng)*100); //浮点数减去整数部分得到小数部分,小数部分乘以100后得到2位小数值
		return new String[]{""+zheng,String.valueOf(xiao)};   //整数转换为字符串(2种方法)
	}
	
	/**
	 * 把一个四位的数字字符串变成汉字字符串
	 * @param numStr 需要被转换的四位数字字符串
	 * @return 四位字符串被转换为汉字字符串
	 */
	private String toHanStr(String[] numStr){
		String result="";
		int numLen0=numStr[0].length();
		int numLen1=numStr[1].length();	
		int[] num0=new int[numLen0];
		int[] num1=new int[numLen1];
		//赋值
		for(int i=0;i<numLen0;i++) {
			num0[i]=numStr[0].charAt(i)-48;
		}
		for(int j=0;j<numLen1;j++) {         
			num1[j]=numStr[1].charAt(j)-48;
		}
		
		
		for(int i=0;i<numLen0;i++){
			if(num0[i]!=0){							//非零情况
				result+=hanArr[num0[i]]+unitArr[1+numLen0-i];
			}
			else if(i==0&&num0[i]==0) {					//最高位是零
				result+="";
			}
			
			//中间位是零
			else if(i!=numLen0-1&&i!=0&&num0[i]==0&&num0[i+1]!=0){	      //中间位数是只有一个零
				result+=hanArr[num0[i]];
			}
			
			else if(i!=numLen0-1&&i!=0&&num0[i]==0&&num0[i+1]==0){	      //中间位数是只有一个零
				result+="";
			}
			
			else if(i==numLen0-1&&num0[i]==0) {			//个位是零
				result+=unitArr[1+numLen0-i];
			}
			
		}

		for(int j=0;j<numLen1;j++) {
			if(num1[j]!=0){
				result+=hanArr[num1[j]]+unitArr[1-j];
			}
			if(num1[j]==0) {
				result+="";
		}		
		}
		return result;
	}
	
	public static void main(String[] arg){
		Num2Rmb nr=new Num2Rmb();
		String[] test=nr.divide(3003.10);
		//String[] test2= {"3005","25"};
		System.out.println(nr.toHanStr(test));
		
	}
}

改进中将判断是否连续出现了0

猜你喜欢

转载自blog.csdn.net/WtMaple/article/details/82381319