A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

package jdbcutil;
import java.util.ArrayList;


/**
* 第10题: 金额转换,阿拉伯数字转换成中国传统形式。
* 例如:101000001010   转换为   壹仟零壹拾亿零壹仟零壹拾圆整
*
*
*
*/

/**
* 题目分析:本题实现比较复杂,主要是对连续零的判断,通过循环判断每一位以及
* 前一位是否为零,来控制是否删除多余的零,实现字符串的金额转换
*
*
*/
public class Test10 {

       
        /**
         * 主函数
         * @param args
         */
        public static void main(String[] args) {
               
                //定义一个阿拉伯数字的字符串数组
                String[] arr = {"101789010","0010198654345010","100","sdffd100"};
                //遍历数组
                for(int i=0;i<arr.length;i++)
                {
                        String str = transform(arr[i]);                //调用函数,将阿拉伯数字金额 转换为中国传统形式金额
                        System.out.println(arr[i]+" 转化后为: "+str);        //打印转换后的字符串内容
                }
        }
       
        /**
         *  将字符串金额str转换为中国传统金额表示方式
         * @param str
         * @return
         */
        public static String transform(String str){
                //使用正则表达式判断字符串格式是否为数字格式
                if(!str.matches("\\d+")){
                        System.out.println("字符串" + str + "不是数字格式,无法转换!");
                        return null;
                }
                //将字符串最前面的0去掉
                while(str.startsWith("0")){
                        str = str.substring(1, str.length());
                }
                //将字符串数字替换成中文数字
                String[] num = new String[]{"0","1","2","3","4","5","6","7","8","9"};
                String[] cnNum = new String[]{"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
                for(int i=0; i<10; i++){
                        str = str.replace(num[i], cnNum[i]);
                }
               
                StringBuilder sb = new StringBuilder(str);//StringBuilder容器中存放字符串,用于插入删除操作
                int index = str.length()-1;   //从第index个字符从后往前开始操作,操作一次,index--
                //存放金额单位
                String[] unit = {"","拾","佰","仟"};
                String[] unit4 = {"萬","亿"};
               
                boolean flag = false;//判断前一个数是否为零的标记
               
                for(int i=0; i<str.length(); i++){//循环体内对容器sb进行操作
                       
                        //每4位插入万每8位插入亿,最低位先不设置单位
                        if(i%4 == 0 && i != 0){
                                //根据金额规则,单位万前面为4个零时,不插入万,并将index位置(最低位)的零删除
                                if((i/4-1)%2 == 0 && index >= 3 && str.substring(index-3, index+1).equals("零零零零")){
                                        sb.deleteCharAt(index);
                                        index--;
                                        continue;
                                }
                                //否则在index+1位置插入相应的单位:万、亿
                                sb.insert(index+1, unit4[(i/4-1)%2]);
                        }
                        //如果4位的最低位为零,删除最低位的零,将零标志置为true
                        if(i%4 == 0 && str.charAt(index) == '零'){
                                sb.deleteCharAt(index);
                                flag = true;
                                index--;
                                continue;
                        }
                        //如果前一位为零并且这一位也为零,删除这一位的零
                        if(flag && str.charAt(index) == '零'){
                                sb.deleteCharAt(index);
                                index--;
                                continue;
                        }
                        //如果当前位为零,将零标志置为true
                        if(str.charAt(index) == '零'){
                                flag = true;
                                index--;
                                continue;
                        }
                        //当前位不为零,将零标志位置为false,插入金额单位
                        flag = false;
                        sb.insert(index+1, unit[i%4]);
                        index--;
                }
                //完善金额表示形式
                sb.append("圆整");
                return sb.toString();
        }
       

}

2 个回复

倒序浏览
已看晕....
回复 使用道具 举报
你这个 做的好复杂。。。看的都好乱
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马