黑马程序员技术交流社区

标题: 花了一天的成果,与大家分享下,求扶正(求优化代码) [打印本页]

作者: 小田    时间: 2015-5-1 08:51
标题: 花了一天的成果,与大家分享下,求扶正(求优化代码)
/**
定义一个常用的工具函数:需将一个浮点数转换成人民币读法字符串。
思路:1、现将这个浮点数转换为整数部分和小数部分并存入字符串数组中。
        2、分别对整数和小数部分进行转换。
        3、将转换后的两部分字符串连接在一起。
@author 小田
@version 1.0
*/
public class  Rmb
{
        private String [] p={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
        private String [] p1={"拾","佰","仟"};
        /**
         * 把一个浮点数分成整数部分和小数部分
         * @param x 需要分解的浮点数
         * @return 分解出来的整数部分和小数部分,字符串数组的第一个元素是整数不封,第二个元素是小数部分
         * */
        private  String [] stringArray(double x)
        {
                long zheng=(long)x;//将浮点数强制类型转换,获得整数部分
                long xiao=Math.round((x-zheng)*100);//通过Math类的静态方法获得浮点数的小数部分。
                return new String []{zheng+"",String.valueOf(xiao)};//将整数部分和小数部分都以字符串形式存入字符串数组
        }
        /**
         * 将一个浮点数转换成人民币读法字符串
         * @param x 需要转换的浮点数
         * @return 转换后的人民币读法字符串
         * */
        public  String zhuanHuan(double x)
        {
                String [] m=stringArray(x);//将浮点数拆分为整数部分和小数部分
                String zheng1=m[0];//将获得的整数部分赋给字符串变量zheng1
                String xiao1=m[1];//将获得的小数部分赋给字符串变量xiao1
                String rmbxiao=xiaoZhuan(xiao1);//获取小数部分的人民币读法字符串
                String rmbzheng=zhengZhuan(zheng1);//获取整数部分的人民币读法字符串
                return rmbzheng+rmbxiao;//返回整个浮点数字的人民币读法字符串
               
        }
        /**
         * 将小数部转化为人民币读法字符串
         * @param xiao1 需要转化的小数部分
         * @return 转换后的人民币读法字符串
         * */
        private String xiaoZhuan(String xiao1)
        {
                String result;//定义一个字符串来记录小数部分的人民币读法
                if (xiao1.length()>1)//如果小数部分字符串长度大于1,则小数的有效位为两个
                {
                        if(xiao1.charAt(0)-48==0)//判断角位是否为零
                        {
                                if (xiao1.charAt(1)-48==0)//判断分位是否为零
                                {
                                        result="零角零分";//当角位和分位同时为零时,记录人民币读法为"零角零分"
                                }
                                else
                                {
                                        result=p[xiao1.charAt(1)-48]+"分";//当角位为零,分位不为零时,记录人民币读法
                                }
                        }
                        else
                        {
                                if (xiao1.charAt(1)-48==0)
                                {
                                        result=p[xiao1.charAt(0)-48]+"角";//当角位不为零,分位为零时,记录人民币读法
                                }
                                else
                                {
                                        result=p[xiao1.charAt(0)-48]+"角"+p[xiao1.charAt(1)-48]+"分";//当角位和分位同时不为零时,记录人民币读法
                                }
                        }
                }
                else
                        result=p[xiao1.charAt(0)-48]+"分";//小数部分的字符串长度为1时,记录人民币读法。
                return result;
        }
        private String firstPanDuan(String str)
        {
                String result="";
                result+=p[str.charAt(0)-48]+p1[str.length()-2];
                for (int x=1 ;x<str.length() ;x++ )
                {
                        int num1=str.charAt(x)-48;
                        if (num1!=0&&x!=str.length()-1)
                        {
                                result+=p[num1]+p1[str.length()-2-x];
                        }
                        else
                        {
                                if (x>=2)
                                {
                                        if (str.charAt(x-1)-48==0&&str.charAt(x)-48==0)
                                                continue;
                                }
                                else
                                {
                                        if (str.charAt(str.length()-1)-48==0)
                                        continue;
                                }
                        }
                }
                return result;
        }
        private String lastPanDuan(String str2)
        {
                String result="";
                if(str2.charAt(0)-48!=0)
                        result+=p[str2.charAt(0)-48]+p1[str2.length()-2];
                for (int x=1 ;x<str2.length() ;x++ )
                {
                        int num3=str2.charAt(x)-48;
                        if (num3!=0&&x!=str2.length()-1)
                        {
                                result+=p[num3]+p1[str2.length()-2-x];
                        }
                        else
                        {
                                if (x>=2)
                                {
                                        if (str2.charAt(x-1)-48==0&&str2.charAt(x)-48==0)
                                                continue;
                                }
                                else
                                {
                                        if (str2.charAt(str2.length()-1)-48==0)
                                        continue;
                                }
                                result+=p[num3];
                        }
                }
                return result;
        }
        /**
         * 将整数部分转换为人民币读法的字符串
         * @param zheng1 需要转换的整数部分
         * @return 转换后的整数部分人民币读法字符串。
         * */
        private String zhengZhuan(String zheng1)
        {
                String result="";
                if (zheng1.length()>8&&zheng1.length()<13)//如果浮点数的整数部分长度大于8,小于13,则读法分位三个部分:xx亿xx万xx元
                {
                        String str=zheng1.substring(0,zheng1.length()-8);//取出第一部分,xx亿进行人民币读法的转换
                        result=firstPanDuan(str);
                        result+="亿";
                        String str1=zheng1.substring(zheng1.length()-8,zheng1.length()-4);//取出第二部分xx万,进行人民币读法的转换
                        if(str1.charAt(0)-48!=0)//第二部分最高位为零则不读
                                result+=p[str1.charAt(0)-48]+p1[str1.length()-2];
                        for (int x=1 ;x<str1.length() ;x++ )//从第二位开始转换
                        {
                                int num2=str1.charAt(x)-48;
                               
                                if (num2!=0&&x!=str1.length()-1)
                                {
                                        result+=p[num2]+p1[str1.length()-2-x];
                                }
                                else
                                {
                                        if (x>=2)
                                        {
                                                if (str1.charAt(x-1)-48==0&&str1.charAt(x)-48==0)//若连续两个零,也不读
                                                        continue;
                                        }
                                        else
                                        {
                                                if (str1.charAt(str1.length()-1)-48==0)//第二部分最低位为零,也不读
                                                continue;
                                        }
                                        result+=p[num2];//将不是零的最低位读出
                                }
                        }
                        if(str1.charAt(0)-48!=0||str1.charAt(1)-48!=0||str1.charAt(2)-48!=0||str1.charAt(3)-48!=0)
                                result+="万";//第二部分不全为零,则万第二部分加上“万”
                        String str2=zheng1.substring(zheng1.length()-4,zheng1.length());//取出第三部分,xx元
                        result+=lastPanDuan(str2);
                        result+="元";
                }
                else if (zheng1.length()>4&&zheng1.length()<9)//当整数部分的字符串长度为4-9时
                {
                        String str1=zheng1.substring(0,zheng1.length()-4);
                        result=firstPanDuan(str1);
                        result+="万";
                        String str2=zheng1.substring(zheng1.length()-4,zheng1.length());
                        result+=lastPanDuan(str2);
                        result+="元";
                }
                else if (zheng1.length()>0&&zheng1.length()<5)//当整数部分的字符串长度为1-4时
                {
                        String str2=zheng1.substring(0,zheng1.length());
                        result=firstPanDuan(str2);
                        result+="元";
                }
                return result;
        }
        public static void main (String [] args)
        {
                Rmb rb=new Rmb();
                System.out.println(rb.zhuanHuan(1000000304.02));
        }
}


作者: LPStone    时间: 2015-5-1 10:31
楼主好厉害




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2