java人民币读法转换

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 }

posted @ 2018-03-28 20:03 Reyon 阅读(...) 评论(...) 编辑 收藏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值