最近学习了字符串相关的知识,想写了一个程序来巩固一下。就选了数字金额转大写金额这个题。不多说,看代码。

import java.text.*;
import java.util.*;

public class ConvertMoney {

	private static final String[] STR_UNIT ={"","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟"};
	private static final String[] STR_NUMBER ={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
	
	public static void main(String[] args) {
		// TODO 自动生成的方法存根

		Scanner scan=new Scanner(System.in);
		System.out.println("请输入一个数字金额");
		String s=convert(scan.nextDouble());
		System.out.println(s);
	}
	public static String convert(Double a){
		//把输入的浮点型转化为字符串型
		String s=new DecimalFormat("#.00").format(a);
		//如果输入的数字金额有小数点
		if(s.indexOf(".")!=-1){
			String z_num=s.substring(0,s.indexOf("."));           //取整数部分
			if(z_num.length()>12){
				System.out.println("数字太大不能转化");
				return "";
			}
		}
		String point;
		if(s.indexOf(".")!=-1){
			point="元";
		}else{
			point="元整";
		}
		String result=getInteger(s)+point+getDecimal(s);
		if(result.startsWith("元")){
			result=result.substring(1, result.length());
		}
		return result;
	}
	
	public static String getInteger(String a){
	   if(a.indexOf(".")!=-1){
		   a=a.substring(0,a.indexOf("."));                     //取整数部分
	   }
	   a=new StringBuffer(a).reverse().toString();              //反转字符串
	   StringBuffer temp=new StringBuffer();                   
       //String为不可变对象,StringBuffer为可变对象
	   //StringBuffer.append()在连接多个对象的时候会比String的“+”快
	   for(int i=0;i<a.length();i++){                           
		      temp.append(STR_UNIT[i]);                         //添加位
		      temp.append(STR_NUMBER[Character.getNumericValue(a.charAt(i))]);    //添加大写数字,Character.getNumericValue()把char转为int
	   }
	   a=temp.reverse().toString();                             //再次反转字符串 4
	   
	   a=numreplace(a,"零拾","零");                               //根据命名方式来替换
	   a=numreplace(a,"零佰","零");
	   a=numreplace(a,"零仟","零");
	   a=numreplace(a,"零万","万");
	   a=numreplace(a,"零亿","亿");
	   a=numreplace(a,"零零","零");
	   a=numreplace(a,"亿万","亿");
	   //如果个位上为零,那么除去字符“零”
	   if(a.lastIndexOf("零")==a.length()-1){
		  a=a.substring(0,a.length()-1);
	   }
	   return a;
	}
	
	public static String getDecimal(String a){
		if(a.indexOf(".")==-1){
			return "";
		}
		a=a.substring(a.indexOf(".")+1,a.length());               //取小数部分
		a=new StringBuffer(a).reverse().toString();               //反转字符串
		StringBuffer temp=new StringBuffer(); 
		for(int i=0;i<2;i++){
			if(i==0)
				temp.append("分");
			if(i==1)
                temp.append("角");
			temp.append(STR_NUMBER[Character.getNumericValue(a.charAt(i))]);
		}
		a=temp.reverse().toString();                              //反转字符串
		a=numreplace(a,"零分","零");
        a=numreplace(a,"零角","零");
 	    if(a.lastIndexOf("零")==a.length()-1){  //两个相同的if,既可以处理有一个零的情况,又可以处理2个零的情况
 		  a=a.substring(0,a.length()-1);
 	    }
 	    if(a.lastIndexOf("零")==a.length()-1){
 		  a=a.substring(0,a.length()-1);
 	    }
 	    return a;
	}
	
	public static String numreplace(String num,String a,String b){    //多次替换函数,根据此题,循环4级即可
		for(int i=0;i<4;i++){
			num=num.replace(a, b);
		}
		return num;
	}
}

测试结果:

java 大写金额 java金额转大写_Java


这里关键点就是如何解决数字和大写金额之间的对应,我们分两部分处理:整数部分和小数部分。

首先先不管其他,先把数字转为汉字数字和相应的位。其次,要处理是否有零,能不能缺少万和亿等问题

具体替换方案如代码注释。

其实我这个代码有点小毛病,就是只能精确到分,下一位直接舍弃了,没有进位处理。所以在精确度方面有所欠缺。