- 把【整数部分】的数字,由个位开始,4个数字分为一组,最高位没有数字就补0,并记录总共的数组个数,总共有3组,也就3*4的二维数组;
- 对于每个数组统一处理,最后将最开头的“零去掉”,将“亿”、“万”“元”字前面的“零”去掉;
- 当读取到0时,检查它的上一位是否为0,如果上一位是0,则不做处理,如果上一位不是0或者上一位不存在,均记下“零”;
- 读取每个数字,转换为对应的大写汉字,并加上权重“仟、佰、拾”,根据读取的是第几个数组,后面添加相应的“亿”、“万”“元”;
- 把【小数部分】做一维数组处理,仅保留两位小数,对应“角”和“分”,数字0不处理;
测试数字『120, 3005, 7600.89』,读作:壹佰贰拾亿叁仟零伍万柒仟陆佰元捌角玖分。
package theTest; public class NumToRmb { private String[] hanArr={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"}; private String[] unitArr={"仟","佰","拾"}; /** * 把一个浮点数分解成整数部分和小数部分字符串 * @param num 需要被分解的浮点数 * @return 分解出来的整数部分和小数部分,第1个数组元素是整数部分,第2个数组元素是小数部分。 */ private String[] divide(double num){ //将一个浮点数强制转换为long型,即得到它的整数部分 long zheng=(long)num; //浮点数减去整数部分,得到小数部分,小数部分乘以100取整得到两位小数 long xiao=Math.round((num-zheng)*100); //这里使用两种方法将整数转换为字符串 return new String[]{String.valueOf(zheng),xiao+""}; } /** * 将整数分成4个数字为一组的字符串处理,转化成大写数字再将它们连接起来,得到最终的人民币读法 * @param num 需要被转化为大写数字的浮点数 * @return 返回整个数字的人民币读法 */ private String conHanStr(double num){ //存储整数结果、小数结果 String resZheng=""; String resXiao=""; //存储最终结果 String result=""; //分别存储整数部分和小数部分字符串 String zhengStr=divide(num)[0]; String xiaoStr=divide(num)[1]; /*小数部分的处理*/ if(xiaoStr.length()==1){ xiaoStr="0"+xiaoStr; } resXiao=xiao2Han(xiaoStr); /*整数部分的处理*/ //记录字符串个数,是第几个数组 int countArr=0; String tempStr=""; //记录位数 int countNum=0; for(int i=zhengStr.length()-1;i>=0;i--){ countNum++; tempStr=zhengStr.charAt(i)+tempStr; if(i-1<0){ //i已经是最后一个数字,不够的位,补0 while(tempStr.length()<4){ tempStr="0"+tempStr; } countArr++; resZheng=zheng2Han(countArr,tempStr)+" "+resZheng; }else{ if(countNum==4){ countArr++; resZheng=zheng2Han(countArr,tempStr)+" "+resZheng; countNum=0; tempStr=""; } } } //去掉开头的零 if(resZheng.charAt(0)==‘零‘){ resZheng=resZheng.substring(1,resZheng.length()); } /*整数和小数的连接*/ //表示整数部分为0 if(resZheng.charAt(0)==‘元‘){ resZheng="零"+resZheng; } result=resZheng+resXiao; return result; } /** * 每个4位的整数组转化为大写的数字 * @param count 记录是第几个数组(1-3) * @param str 需要被转换的数组 * @return 返回该数组人民币读法 */ private String zheng2Han(int count,String str){ String result=""; for(int j=0;j<4;j++){ int tempNum=str.charAt(j)-48; if(tempNum!=0){ if(j!=3){ result+=hanArr[tempNum]+unitArr[j]; }else{ result+=hanArr[tempNum]; } }else{ if((j-1<0)||(str.charAt(j-1)-48!=0)){ result+=hanArr[tempNum]; } } } //去掉末尾的零 if(result.charAt(result.length()-1)==‘零‘){ result=result.substring(0, result.length()-1); } //去零之后添加“亿、万、元、角、分”。 switch(count){ case 1: result+="元"; break; case 2: result+="万"; break; case 3: result+="亿"; break; default: System.out.println("仅支持不大于9999,9999,9999.99的数字!"); return ""; } return result; } /** * 小数转化为大写的数字 * @param str 需要被转换的数组 * @return 返回该小数人民币读法 */ private String xiao2Han(String str){ String result=""; if(!str.equals("00")){ for(int i=0;i<2;i++){ int tempNum=str.charAt(i)-48; if((tempNum!=0)&&(i==0)){ result+=hanArr[tempNum]+"角"; } if((tempNum!=0)&&(i==1)){ result+=hanArr[tempNum]+"分"; } } } return result; } /** * 主函数 * @param args */ public static void main(String[] args) { NumToRmb nr=new NumToRmb(); System.out.println(nr.conHanStr((double)12030060078.95)); } }
原文地址:https://www.cnblogs.com/dlcicc/p/8521356.html
时间: 2024-10-07 06:20:00