基本思想:
将数字转化为字符串,以小数点为界限拆为:整数,小数点,小数,三各部分,各个部分转换为大写格式,最后拼接在一起。(主要运用了字符串的拆分,替换,转化)
1.导入的包
import java.text.DecimalFormat;import java.util.Scanner;
2.静态变量
static String[] UNIT1={"","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟"};//整数单位数组static String[] UNIT2={"角","分","厘"};//小数单位数组
3.主函数
public static void main(String args[]){System.out.println("请输入金额:");Scanner sca=new Scanner(System.in);System.out.println(convert(sca.nextDouble()));}
4.拆分方法:将数字转换为字符串之后拆分
static String convert(double d){DecimalFormat df=new DecimalFormat("#0.###");//自定义数字字符串的格式String str=df.format(d);if(str.indexOf(".")!=-1){//是否存在小数点String num=str.substring(0, str.indexOf("."));//截取小数点之前的位数if(num.length()>12){System.out.println("数字太大,不能完成转换,支持千亿及以下级别的转换");return "";}}else{if(str.length()>12){System.out.println("数字太大,不能完成转换,支持千亿及以下级别的转换");return "";}}String point=null;if(str.indexOf(".")!=-1){point="元";}else{//如果没有小数则是"元整"point="元整";}String result=getInteger(str)+point+getDecimal(str);//输出格式为“整数+小数点+小数”if(result.startsWith("元")){//当整数是0的情况下,没有“元”result=result.substring(1,result.length());//将“元”截取掉}return result;}
5.整数部分的转换方法(用到了replaceN()和getNumber()两个方法)
static String getInteger(String str){//得到整数部分大写if(str.indexOf(".")!=-1){str=str.substring(0,str.indexOf("."));}str=new StringBuffer(str).reverse().toString();//反转的目的在于可以按顺序添加单位char []s=str.toCharArray();StringBuffer temp=new StringBuffer();for(int i=0;i<str.length();++i){//先添加单位后添加数字(当前是反转状态)temp.append(UNIT1[i]);temp.append(getNumber(s[i]));}str=temp.reverse().toString();//将得到的字符串反转回来str=replaceN(str,"零拾","零");str=replaceN(str,"零佰","零");str=replaceN(str,"零仟","零");str=replaceN(str,"零万","万");str=replaceN(str,"零亿","亿");str=replaceN(str,"零零","零");str=replaceN(str,"亿万","亿");//出现零的情况需要调整if(str.endsWith("零")){str=str.substring(0,str.length()-1);}return str;}
6.小数部分的转换方法(用到了replaceN()和getNumber()两个方法)
static String getDecimal(String str){//得到小数部分大写if(str.indexOf(".")==-1){return "";}str=str.substring(str.indexOf('.')+1,str.length());char[]s=str.toCharArray();//因为小数部分单位从大到小,所以不需要反转StringBuffer temp=new StringBuffer();for(int i=0;i<str.length();++i){temp.append(getNumber(s[i]));temp.append(UNIT2[i]);}str=temp.toString();str=replaceN(str,"零角","零");str=replaceN(str,"零分","零");str=replaceN(str,"零厘","零");str=replaceN(str,"零零","零");//出现零的几种情况需要调整if(str.endsWith("零")){str=str.substring(0, str.length()-1);}return str;}
7.替换方法
static String replaceN(String str,String oStr,String nStr){while(true){if(str.indexOf(oStr)==-1){//当不包含指定内容则跳出while循环break;}str=str.replaceAll(oStr, nStr);//替换}return str;}
8.得到数字大写的方法
static String getNumber(char i){//得到数字的大写switch(i){//分支语句case '0':{return "零";}case '1':{return "壹";}case '2':{return "贰";}case '3':{return "叁";}case '4':{return "肆";}case '5':{return "伍";}case '6':{return "陆";}case '7':{return "柒";}case '8':{return "捌";}case '9':{return "玖";}default:{return "";}}}
测试案例: