java人民币读法转换
实现浮点数转换成人民币读法字符串
编写一个程序,将浮点数转换成人民币读法字符串,
例如: 将1006.333转换为壹千零陆元叁角叁分。
题意分析:
将浮点数分成整数部分和小数部分,分开处理整数部分和小数部分。
小数部分的处理比较简单,截取保留两位数字,并将其转换成几角几分的字符串即可。
整数部分可以以4位数字分为几个数组,每一个4位数字都是几千几百几十几(添加适当的单位)。
这4位数字若出现在1~4位,则后面添加‘元’,若出现在5~8位,则添加‘万’,若出现在9~12位,则添加‘亿’。
超过12位以后,暂不考虑,实际上,超过12位数后,double类型存储溢出,会造成数据的错误。
代码编译分析:
将浮点数分成整数部分和小数部分字符串,只要把double型的浮点数强制转换成long型即可得到整数部分,
将double型的浮点数减去long型的整数部分即可得到浮点数的小数部分,由于只需取两位则乘以100,再用
Math.round函数取整得到小数部分。用“zheng+”“ ”或"String.valueOf(xiao)"将整数转换为字符串。
将小数部分的字符串逐个进行判断,在其后面适当的增加角、分,即可转换成功。
将整数部分的字符串补零,使其字符串长度成为4的倍数,以便4位一组的分组。使用字符串截取函数截取后4
位的字符串,并使原字符串更新为除去后4位以后的字符串。
4位一组的字符串进行汉字字符的转换,若非最后一位数字且数字不为零,则需添加单位。
每四位的已转换好的汉字字符串连接时需注意顺序。
特殊情况分析:
若数字小数点后一位为0,如19.08,则需在小数部分转换时考虑小数部分字符串的长度,若长度为1,则特殊处理。
若数字如10009所示,后四位截取后为0009,转换时易出现错误,需将其转换为字符串9后再将其进行汉字字符的
转换。
若数字如1009所示,2个零相邻,则需对转换时单个字符为0时的前一个字符进行判断,是否需要进行转换操作。
若数字如1890所示,最后一位为零,则需对转换后的字符串进行判断最后一个字符是否为零,是否需要删去。
若数字如0.89,或10000.89所示,截取的4位字符串位0,则需单独进行转换操作。
1 package 人民币读法; 2 3 import java.util.Arrays; 4 import java.util.Scanner; 5 6 // 编写一个程序,将浮点数转换成人民币读法字符串,例如,将1006.333转换为壹千零陆元叁角叁分 7 // D:\疯狂Java讲义\codes\04\4.6 NUM2RMB 8 9 public class Rmb { 10 private String[] str1 = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"}; 11 private String[] str2 = {"十","百","千"}; 12 private String[] str3 = {"角","分"}; 13 private String[] str4 = {"元","万","亿"}; 14 // 把浮点数分解成整数部分字符串 15 private String divadeZheng(double num) 16 { 17 long zheng = (long)num; 18 // 整型转换成字符串 19 return zheng + ""; 20 } 21 // 把浮点数分解成小数部分字符串 22 private String divadeXiao(double num) 23 { 24 long zheng = (long)num; 25 // 得到浮点数的小数部分 26 long xiao = Math.round((num-zheng)*100); 27 // 用方法把整型转换成字符串 28 return String.valueOf(xiao); 29 } 30 31 // 把小数部分的数字字符串转换成汉字字符串 32 private String toStr1(String xiao) 33 { 34 String re1 = ""; 35 int len = xiao.length(); 36 if(len==2) 37 { 38 for(int i = 0;i<2;i++) 39 { 40 // 把字符串转换成数字 41 int num = xiao.charAt(i) - 48; 42 // 数字不为零则需要加单位,为零则不操作 43 if(num!=0) 44 { 45 re1 += str1[num] + str3[i]; 46 } 47 } 48 } 49 // 若长度为1,例:12.09小数部分为9 50 if(len==1&&xiao.charAt(0)!='0') 51 { 52 int num = xiao.charAt(0) - 48; 53 // 此时只有分,加单位str3【1】 54 re1 +=str1[num] + str3[1]; 55 } 56 return re1; 57 } 58 59 // 把一个四位的数字字符串变成汉字字符串 60 private String toStr(String zheng) 61 { 62 String re = "" ; 63 int j = 0; 64 int lenz = zheng.length(); 65 // 特殊情况如输入0.89时,整数字符串为0的处理 66 if(zheng.charAt(0)=='0'&&lenz==1) 67 { 68 re +="零"; 69 return re; 70 } 71 // 遍历每一位数字 72 for(int i =0;i<lenz;i++) 73 { 74 int num = zheng.charAt(i) - 48; 75 // 若不是最后一位数字且数字不为零,则需要添加单位 76 if(i!=lenz-1&&num!=0) 77 { 78 re += str1[num]+str2[lenz-2-i]; 79 } 80 // 对于连续0出现的特殊处理,如1009,第二个零不进行操作 81 else if(!(num==0&&re.charAt(j-1)=='零')) 82 { 83 re += str1[num]; 84 } 85 j = re.length(); 86 } 87 // 对特殊情况最后一位是零的处理,如1990,删除掉末尾的零 88 if(re.charAt(j-1)=='零') 89 { 90 re = re.substring(0, j-1); 91 } 92 return re; 93 } 94 // 对于金额的整数部分在12位数以内的处理,以4位数为一组, 95 // 如1234(亿),5678(万),1234(元).89, 96 private String zhengDivade(String zheng) 97 { 98 int len = zheng.length(); 99 String Re = ""; 100 int n = 0; 101 // 判断整数部分的长度,考虑需要分几个组 102 if(len>=9) 103 n = 3; 104 else if(len>=5) 105 n = 2; 106 else if(len>=1) 107 n = 1; 108 // 若位数非4的倍数,则在前面补0,直到位数为4的倍数为止 109 // 如 12,2345补为0012,2345 110 if(len%4!=0) 111 { 112 String zh = ""; 113 int s = len%4; 114 // 在前面补0 115 for(int k=0;k<(4-s);k++) 116 { 117 zh += "0"; 118 } 119 zh += zheng; 120 zheng = zh; 121 } 122 // 进行n个组合的串联 123 // 进行n次循环 124 for(int i=0;i<n;i++) 125 { 126 String Zheng = ""; 127 String sss =""; 128 // 长度在变化 129 len = zheng.length(); 130 // 提取出整数部分后四位,进行分开的转换 131 Zheng = zheng.substring(len-4); 132 // 除去已经提取的字符串以外的字符串,字符串更新 133 zheng = zheng.substring(0, len-4); 134 int m =0,me=0; 135 // 把字符串转换成整形数,如 0012换成12 136 for(int j=3;j>=0;j--) 137 { 138 m =(int) ((Zheng.charAt(j)-48)*Math.pow(10, 3-j)); 139 me += m; 140 } 141 // 把数字12装换成字符串12 142 Zheng = String.valueOf(me); 143 // 把字符串12换成 壹拾贰 144 sss = this.toStr(Zheng); 145 // 衔接上 元 等单位,再加上已经转换好的 汉字字符串 ,此处注意每组字符串间的顺序 146 sss += str4[i]+Re; 147 Re = sss; 148 } 149 return Re; 150 } 151 152 // 主方法,输入金额,并将整数部分和小数部分联接 153 public static void main(String[] args) { 154 // TODO Auto-generated method stub 155 Rmb s = new Rmb(); 156 System.out.println("请输入整数部分为十二位以内的金额:"); 157 Scanner in = new Scanner(System.in); 158 double a = in.nextDouble(); 159 System.out.println("人民币读法为:"); 160 // 将整数部分的汉字字符串和小数部分的汉字字符串联接 161 System.out.println(s.zhengDivade(s.divadeZheng(a))+s.toStr1(s.divadeXiao(a))); 162 } 163 164 }